optimizer_switch
システム変数を使用してオプティマイザの動作を制御することができます。
MySQL 5.1.34
以降、optimizer_switch
システム変数の値はフラグのセットになりました。各フラグの値は
on
または
off
で、対応するオプティマイザ動作を有効にするか無効にするかを指定します。この変数にはグローバル値とセッション値があり、実行時に変更できます。グローバル値のデフォルトはサーバーの起動時に設定できます。
オプティマイザの現在のフラグセットを表示するには、変数値を選択します。
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,
index_merge_sort_union=on,
index_merge_intersection=on
optimizer_switch
の値を変更するには、1
つ以上のコマンドをコンマで区切ったリストを値として割り当てます。
SET [GLOBAL|SESSION] optimizer_switch='command
[,command
]...';
各 command
値は、次の表に示す形式のいずれかでなければいけません。
コマンド構文 | 意味 |
default |
すべての最適化をそのデフォルト値にリセットします |
|
指定した最適化をそのデフォルト値に設定します |
|
指定した最適化を無効にします |
|
指定した最適化を有効にします |
値に指定するコマンドの順序は重要ではありませんが、default
が存在する場合はそれが最初に実行されます。値に同じ
opt_name
を複数指定することは許可されていないため、エラーになります。値にエラーがあると、ステートメント全体がエラーで失敗し、optimizer_switch
は現在の値のままになります。
次の表に、使用できる
opt_name
フラグ名を示します。
フラグ名 | 意味 |
index_merge |
すべてのインデックス結合最適化を制御します |
index_merge_union |
インデックス結合ユニオンアクセス最適化を制御します |
index_merge_sort_union |
インデックス結合ソートユニオンアクセス最適化を制御します |
index_merge_intersection |
インデックス結合共通集合アクセス最適化を制御します |
インデックス結合の詳細については、項4.2.6. 「インデックス結合最適化」を参照してください。
optimizer_switch
に値を割り当てるとき、指定されていないフラグは現在の値を維持します。そのため、オプティマイザのほかの動作に影響を与えることなく、特定の動作を
1
つのステートメントで有効または無効にすることができます。ステートメントは、ほかのオプティマイザフラグの有無やその値には依存しません。すべてのインデックス結合最適化が有効になっていると仮定します。
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,
index_merge_sort_union=on,
index_merge_intersection=on
1 row in set (0.00 sec)
サーバーがインデックス結合ユニオンアクセスメソッドとインデックス結合ソートユニオンアクセスメソッドを特定のクエリーに使用している場合に、それらを使用しないとオプティマイザの実行が向上するかどうかを確認するには、変数値を次のように設定します。
mysql>SET optimizer_switch='index_merge_union=off,index_merge_sort_union=off';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT @@optimizer_switch\G
*************************** 1. row *************************** @@optimizer_switch: index_merge=on,index_merge_union=off, index_merge_sort_union=off, index_merge_intersection=on 1 row in set (0.00 sec)