Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  フルテーブルスキャンを回避する方法

8.2.1.20 フルテーブルスキャンを回避する方法

MySQL がフルテーブルスキャンを使用してクエリーを解決する場合、EXPLAIN からの出力には type カラムに ALL と示されます。これは通常は次の条件で発生します。

  • テーブルがきわめて小さいため、キールックアップで煩わされるよりもテーブルスキャンを実行する方が速くなります。これは、10 行未満の行や短い行長のテーブルによくあります。

  • インデックスが設定されたカラムに対して、ON または WHERE 句に使用可能な制限がありません。

  • インデックスが設定されたカラムと定数値を比較していて、MySQL が (インデックスツリーに基づいて) その定数がテーブルのきわめて大きい部分をカバーしており、テーブルスキャンが高速に行われると計算しました。セクション8.2.1.2「MySQL の WHERE 句の最適化の方法」を参照してください。

  • 別のカラム経由で、カーディナリティーが低い (多数の行がキー値に一致する) キーを使用しています。この場合、MySQL は、キーを使用して、多数のキールックアップが実行され、テーブルスキャンが高速であると想定します。

小さいテーブルでは、テーブルスキャンは多くの場合に適切であり、実行の影響は無視できます。大きいテーブルでは、オプティマイザがテーブルスキャンを誤って選択しないように、次の技法を試してください。

  • ANALYZE TABLE tbl_name を使用して、スキャンされるテーブルのキー分布を更新します。セクション13.7.2.1「ANALYZE TABLE 構文」を参照してください。

  • スキャンされるテーブルに FORCE INDEX を使用して、MySQL に、テーブルスキャンは指定したインデックスを使用するのと比較して著しく負荷が大きいことを伝えます。

    SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
      WHERE t1.col_name=t2.col_name;
    

    セクション13.2.9.3「インデックスヒントの構文」を参照してください。

  • --max-seeks-for-key=1000 オプションを使用して mysqld を開始するか、または SET max_seeks_for_key=1000 を使用して、オプティマイザに、キースキャンでは 1,000 より多くのキーシークは発生しないと想定するように伝えます。セクション5.1.4「サーバーシステム変数」を参照してください。


User Comments
  Posted by Becky D on February 28, 2011
We ran into a condition where we were trying to join on 2 varchar fields that used a different collation. One field was utf-8 and the other was latin1. This was causing a full table scan on a join between the 2 tables. Once we converted the fields to all be utf-8, query went from 9 seconds down to 0.
Sign Up Login You must be logged in to post a comment.