MySQL はコストベースのオプティマイザを使用して、クエリーを実行する最適な方法を判別しています。 多くの場合、MySQL は実行可能な最適なクエリー計画を計算できますが、データに関する情報を十分に取得できず、データについて「学習による」推測を行う必要がある場合があります。
MySQL で「適切」に処理されなかった場合に、MySQL に指示を送るために使用できるツールを次に示します。
-
EXPLAIN
ステートメントを使用して、MySQL がクエリーを処理する方法に関する情報を取得します。 これを使用するには、キーワードEXPLAIN
をSELECT
ステートメントの前に追加します。mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;
EXPLAIN
については、セクション13.8.2「EXPLAIN ステートメント」で詳しく説明しています。 ANALYZE TABLE
を使用して、スキャンされるテーブルのキー分布を更新します。 セクション13.7.3.1「ANALYZE TABLE ステートメント」を参照してください。tbl_name
-
スキャンされるテーブルに
FORCE INDEX
を使用して、テーブルスキャンは該当するインデックスを使用した場合と比較して著しく負荷が高いことを MySQL に通知します。SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
USE INDEX
およびIGNORE INDEX
も役に立つことがあります。 セクション8.9.4「インデックスヒント」を参照してください。 グローバルおよびテーブルレベルの
STRAIGHT_JOIN
。 セクション13.2.10「SELECT ステートメント」を参照してください。グローバルなシステム変数またはスレッド固有のシステム変数をチューニングできます。 たとえば、キースキャンでキー検索が 1,000 回を超えて行われることはないと想定するようにオプティマイザに通知するには、
--max-seeks-for-key=1000
オプションを指定して mysqld を起動するか、SET max_seeks_for_key=1000
を使用します。 セクション5.1.8「サーバーシステム変数」を参照してください。