:: DEVELOPER ZONE
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 を越すキー検索が行われないことを告げる。
© 1995-2005 MySQL AB. All rights reserved.
