免責事項
この記事はSergey Glukhov氏によるMySQL Server Blogの投稿「New Optimizer Hints in MySQL」(2015/7/29)をユーザが翻訳したものであり、Oracle公式の文書ではありません。
MySQLのオプティマイザが特殊なシステム変数、optimizer_switchを持つことは良く知られており、これは様々なインデックスコンディションプッシュダウン(ICP)、バッチキーアクセスなどの様々なオプティマイザのモードを制御できるようにするものだ。optimizer_switchを利用する1つの大きな欠点はこれがステートメント全体に影響することで、しばしば特定のテーブルあるいはクエリブロックの挙動のみを変えた方が望ましい、変える必要があることがある。これらの問題に対処し、使い勝手を向上させる為に、新しくヒント句が追加された。これにより、より強力な、またきめの細かいオプティマイザの挙動の制御がSQL文中で直接実施できる。
新しいヒント句に関していくつかの重要なポイントをあげる。
- コメント文法 /*+ */ が新しいヒント句として利用できる
- 同一コメント中で、複数のヒント句が指定できる。
- クエリブロックはヒント句を含め1つしかコメントを持つことが出来ず、コメントはSELECT、UPDATE、INSERT、REPLACE、またはDELETEの直後に付与しなければならない。
- ヒント句中の正しくない、または無効な文法は警告を出力させる。
- ヒントがコンフリクトしている場合、最初のヒント句のみ有効となりそれに続くコンフリクトしているあるいは重複するヒントは警告を出力し無効化される。
- 複数レベルのヒント句がサポートされている。例えば、ヒント句は特定のテーブルまたはクエリブロックのみに影響を与えるようにすることができる。
次のヒント句はMySQL 5.7.7から追加されたものだ。
BKA
、NO_BKA
: 特定のテーブルまたはクエリブロックへのバッチキーアクセスアルゴリズムの利用を制御するBNL
、NO_BNL
: 特定のテーブルまたはクエリブロックへのブロックネスティッドループアルゴリズムの利用を制御するMRR
、NO_MRR
: 特定のインデックスまたはテーブルへのマルチレンジリードを制御するNO_ICP
: 特定のインデックスまたはテーブルへのインデックスコンディションプッシュダウンの利用を無効化するNO_RANGE_OPTIMIZATION
: 特定のインデックスまたはテーブルへのレンジアクセスの利用を無効化するMAX_EXECUTION_TIME
: ステートメント実行タイムアウトをNミリ秒に設定するQB_NAME
: 特定のクエリブロックに名前を付ける為の補助的なヒント句。この名前は後で複雑な複合ステートメントの中でのヒント句の指定をシンプル化する為に利用できる
MySQL 5.7.8では、Oystein Grovlenがサブクエリのオプティマイザを制御するヒント句戦略を追加した。
SEMIJOIN
、NO_SEMIJOIN
: セミジョイン戦略を有効化または無効化するSUBQUERY
: サブクエリ実体化またはEXISTS戦略(IN-to-EXISTS transformations)を使うかどうかに影響する
新しいヒント句に関する追加の営みの詳細については、マニュアルの新しい節を参照してほしい。
私は新しいヒント句が役立つと分かってもらえるとうれしい! 新しいヒント句について疑問点をお持ちの場合や、問題に遭遇した場合は、ここのコメントで知らせていただき、bugs.mysql.comのバグレポートをオープンするかサポートチケットをオープンして欲しい。(訳注: コメントは元サイトに記載お願いします)
MySQLを使ってくれてありがとう!