MySQLがクエリを解決するのにテーブルスキャンを使用すると、EXPLAIN
からの出力は、type
カラムのALL
を表示します。これはたいてい以下の条件下で生じます。
テーブルが小さすぎて、時間のかかるキールックアップよりもテーブルスキャンの実行のほうが遅くなります。このことは、10行以下の行や短い行をもつテーブルにはよく起こることです。
インデックスカラムに対して、ON
またはWHERE
節内に使用できる制限はありません。
インデックスカラムを定数値と比較し、MySQLは(インデックスツリーに基づいて)その定数がテーブルの大きすぎる部分をカバーしているか、またテーブルスキャンが高速に行われるかを計算します。項6.2.4. 「WHERE
節最適化」を参照してください。
他のカラムをとおして、低濃度(多数の行がキー値に当てはまる)でキーを使用します。この場合、MySQLは、 キーを使用して多数のキールックアップが実行され、またテーブルスキャンもより速く行われるであろうと認識します。
小さいテーブルに対しては、テーブルスキャンはたいてい適切であり、実行の際の影響は無視されます。大きいテーブルに対しては、オプティマイザが間違ったテーブルスキャンを選択しないように、以下の方法を試してください。
スキャンされたテーブルのキー配置を更新するには、ANALYZE
TABLE
を使用してください。項12.5.2.1. 「tbl_name
ANALYZE TABLE
構文」を参照してください。
MySQLに、テーブルスキャンは既存インデックスを使用するのに比べて大変時間がかかることを示すには、FORCE
INDEX
をスキャンされたテーブルに使用してください。
SELECT * FROM t1, t2 FORCE INDEX (index_for_column
) WHERE t1.col_name
=t2.col_name
;
項12.2.7. 「SELECT
構文」を参照してください。
オプティマイザに1,000キーシーク以上のキースキャンがないことを認識させるには、--max-seeks-for-key=1000
オプションで
mysqldを起動させるか、もしくはSET
max_seeks_for_key=1000
を使用してください。項4.2.3. 「システム変数」を参照してください。