MySQL
がテーブルスキャンを使用してクエリを解決した場合、EXPLAIN
では type
カラム内に
ALL
が表示されます。これは、通常以下の場合に起こります。
テーブルが小さく、キー走査よりもテーブルスキャンを行う方が速い場合。 これは、レコードの数が 10 未満で、レコードの長さが短いテーブルではよくあるケースである。
ON
または WHERE
節に、インデックスを張ったカラムを利用する条件がない場合。
インデックスを張ったカラムと変数を比較中に、MySQL
が(インデックスツリーに基づいて)、変数がテーブルの大部分の範囲に及んでいるためテーブルスキャンの方が速いと予測した場合。
See 項5.2.4. 「MySQL による WHERE
節の最適化」。
別のカラムを介して、下位の基数(= 多くの一致レコード)でキーを使用している場合。この場合、MySQL は、そのキーを使用して多くのキールックアップが行われると見なし、テーブルスキャンの方が早いと見なす。
大きなテーブルの '不正な' テーブルスキャンを回避するには、以下のことを行います。
スキャンテーブルに対して ANALYZE
TABLE
を使用し、キーの分布を更新する。 See
項4.6.2. 「ANALYZE TABLE
構文」。
スキャンテーブルに対して FORCE
INDEX
を使用し、テーブルのスキャンは、特定のインデックスの使用と比較すると非常に処理の負荷が高いことを、MySQL
に通知する。 See 項6.4.1. 「SELECT
構文」。
SELECT * FROM t1,t2 force index(index_for_column) WHERE t1.column=t2.column;
--max-seeks-for-key=1000
を指定して
mysqld
を起動するか SET
MAX_SEEKS_FOR_KEY=1000
を行って、オプティマイザに、キースキャンで
1000
を越すキー検索が行われないことを告げる。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.