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