3

エラーが発生するクエリがありました:

エラー1104:SELECTはMAX_JOIN_SIZEより多くの行を調べます。
WHEREを確認し、SELECTが正常な場合はSET SQL_BIG_SELECTS=1またはSETSQL_MAX_JOIN_SIZE=#を使用します。

クエリを変更しましたが、このエラーは発生しなくなりました。max_join_size = 900,000およびsql_big_selects = 0。残念ながら、sshアクセスがありません。phpmyadminを使用する必要があります。

だから私の質問は、特定のクエリが調べる行数を決定する方法はありますか?クエリがmax_join_sizeの制限にどれだけ近いかを確認したいと思います。

編集:これは元のクエリでした:

SELECT * FROM `tz_verify` 
LEFT JOIN `tz_sessions` ON `tz_sessions`.`timesheet_id` = `tz_verify`.`timesheet_id`
AND `tz_sessions`.`client_id` = `tz_verify`.`client_id`
LEFT JOIN `tz_clients` ON `tz_sessions`.`client_id` = `tz_clients`.`id`
LEFT JOIN `tz_tutor_comments` ON `tz_sessions`.`timesheet_id` = `tz_tutor_comments`.`timesheet_id`
AND `tz_sessions`.`client_id` = `tz_tutor_comments`.`client_id` 
LEFT JOIN `tz_notes` ON `tz_sessions`.`notes` = `tz_notes`.`id` 
WHERE `tz_verify`.`code` = 'b65f35601c' AND `confirmed` = 0;

を一時的に実行できるようSQL_BIG_SELECTSにすることができEXPLAINます-出力は次のとおりです。

id  select_type  table              type    possible_keys  key      ref                    rows  extra
1   SIMPLE       tz_verify          ALL     NULL           NULL     NULL                   93    Using where
1   SIMPLE       tz_sessions        ALL     NULL           NULL     NULL                   559
1   SIMPLE       tz_clients         eq_ref  PRIMARY        PRIMARY  tz_sessions.client_id  1
1   SIMPLE       tz_tutor_comments  ALL     NULL           NULL     NULL                   185
1   SIMPLE       tz_notes           eq_ref  PRIMARY        PRIMARY  tz_sessions.notes      1

クエリを書き直す際に、2つの別々のクエリを実行するために分割しました。最初に、からclient_id(たとえば、226)とtimesheet_id(たとえば、75)を検索しtz_verify、次にこのクエリで次の値を使用しました。

SELECT * FROM `tz_sessions` 
LEFT JOIN `tz_clients`
ON `tz_clients`.`id` = 226
LEFT JOIN `tz_tutor_comments` 
ON `tz_tutor_comments`.`timesheet_id` = 75
AND `tz_tutor_comments`.`client_id` = 226
LEFT JOIN `tz_notes` 
ON `tz_sessions`.`notes` = `tz_notes`.`id`
WHERE `tz_sessions`.`client_id` = 226 AND `tz_sessions`.`timesheet_id` = 75;

これがEXPLAIN

id  select_type  table              type    possible_keys  key      ref                    rows  extra
1   SIMPLE       tz_sessions        ALL     NULL           NULL     NULL                   559   Using where
1   SIMPLE       tz_clients         const   PRIMARY        PRIMARY  const                  1
1   SIMPLE       tz_tutor_comments  ALL     NULL           NULL     NULL                   185
1   SIMPLE       tz_notes           eq_ref  PRIMARY        PRIMARY  tz_sessions.notes      1

これは、一度に行うほどきれいではないようです。

4

1 に答える 1

1

EXPLAIN投稿した最初の出力に基づく:

  • 結合サイズは93*559 * 185 = 9617595だと思います
  • tz_sessions最初のクエリは、テーブルとを結合するときに常にインデックスを使用しているとは限らないようtz_tutor_commentsです。次の複合インデックスを追加することをお勧めします(各インデックスは2つのフィールドで構成されています)。
    • テーブルtz_verify:(timesheet_id、client_id)
    • テーブルtz_sessions:(timesheet_id、client_id)
    • テーブルtz_tutor_comments:(timesheet_id、client_id)

これらのインデックスの1つがすでに存在する場合は、再度作成しないでください。

インデックスを追加したら、EXPLAIN(最初のクエリを使用して)再度実行します。クエリが各結合にインデックスを使用していることがわかります(「キー」列を確認してください)。最初のクエリを再度実行しても、エラーが発生しなくなるはずです。

ドキュメンテーション:


EXPLAINCREATEINDEX構文を使用したクエリの最適化
MySQLがインデックスを使用する方法
複数列のインデックス

于 2012-10-05T14:36:23.133 に答える