Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
8年以上前投稿 修正あり

MySQLのオプティマイザヒント(MySQL Server Blogより)

ついにMySQLでもヒント句が利用できるようになる。ヒント句の仕様および、利用できるヒント句種別について紹介する。

原文
New Optimizer Hints in MySQL | MySQL Server Blog (English)
翻訳依頼者
B5aa4f809000b9147289650532e83932
翻訳者
B5aa4f809000b9147289650532e83932 taka-h
原著者への翻訳報告
未報告


免責事項

この記事は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から追加されたものだ。

  • BKANO_BKA : 特定のテーブルまたはクエリブロックへのバッチキーアクセスアルゴリズムの利用を制御する
  • BNLNO_BNL : 特定のテーブルまたはクエリブロックへのブロックネスティッドループアルゴリズムの利用を制御する
  • MRRNO_MRR : 特定のインデックスまたはテーブルへのマルチレンジリードを制御する
  • NO_ICP : 特定のインデックスまたはテーブルへのインデックスコンディションプッシュダウンの利用を無効化する
  • NO_RANGE_OPTIMIZATION : 特定のインデックスまたはテーブルへのレンジアクセスの利用を無効化する
  • MAX_EXECUTION_TIME : ステートメント実行タイムアウトをNミリ秒に設定する
  • QB_NAME : 特定のクエリブロックに名前を付ける為の補助的なヒント句。この名前は後で複雑な複合ステートメントの中でのヒント句の指定をシンプル化する為に利用できる

MySQL 5.7.8では、Oystein Grovlenがサブクエリのオプティマイザを制御するヒント句戦略を追加した。

  • SEMIJOINNO_SEMIJOIN : セミジョイン戦略を有効化または無効化する
  • SUBQUERY : サブクエリ実体化またはEXISTS戦略(IN-to-EXISTS transformations)を使うかどうかに影響する

新しいヒント句に関する追加の営みの詳細については、マニュアルの新しい節を参照してほしい。

私は新しいヒント句が役立つと分かってもらえるとうれしい! 新しいヒント句について疑問点をお持ちの場合や、問題に遭遇した場合は、ここのコメントで知らせていただき、bugs.mysql.comのバグレポートをオープンするかサポートチケットをオープンして欲しい。(訳注: コメントは元サイトに記載お願いします)

MySQLを使ってくれてありがとう!

次の記事
InnoDBにおける効果的な関数インデックス(MySQL Server Blogより)
前の記事
MySQL 5.7におけるサーバーのデフォルト値の改善 (MySQL Server Blogより)

Feed small 記事フィード

新着記事Twitterアカウント