Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
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
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  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.