web-dev-qa-db-ja.com

FORCE INDEXの使用

私はFacebookのMySQLエンジニアが最近行ったプレゼンテーションで、彼はFORCE INDEX I/Oを削減します。

これは、MySQL Query Optimizerがデータディクショナリに移動して計算を行う必要がないことと関係があります。

  • 誰もがこれがどのように機能するか(できれば参照で)説明できますか?
  • これは一般的に従うべき最適化プラクティスですか?
7
Jonathan

FORCE INDEX で参照できる1つの良い情報源は、本 MySQL Database Design and Tuning です。

MySQL Database Design and Tuning

120ページのパラグラフ4で、それは言う:

FORCE INDEXはどこに適合しますか? FORCE INDEX(バージョン4.0.9で初めて有効化)はUSE INDEXと非常によく似ています。 2つのオプションの主な違いは、FORCE INDEXはMySQLに(可能な場合は)より高価なテーブルスキャンの代わりにインデックスを使用するよう要求するのに対し、USE INDEXは依然としてオプティマイザがテーブルスキャンを選択できることです。

同じページでは、MySQLはインデックスが無関係であることを警告せず、USE INDEXの場合はテーブルスキャンに切り替えます。

したがって、FORCE INDEXは、インデックスを使用する前に、MySQLクエリオプティマイザーを式から除外できます。 FORCE INDEXを適切に使用したクエリは、I/Oを削減します。なぜ私はきちんと言うのですか?

それについて考えてください。ナビゲートすることを選択したインデックスが カバリングインデックス であり、カバリングインデックスにリストされている列のみが必要な場合は、テーブルにデータを問い合わせることは不要になります。すべてのI/Oはインデックスページに制限されています。要求されたすべてのデータは、最悪の場合にインデックススキャンを実行することによって取得されます。要求されたデータを並べ替える必要があり、要求された並べ替えをバイパスする場合、これは確かに良いことです。

「エンゲージメントのルール」に関して、FORCE INDEXは、

  • カバリングインデックスの参照
  • インデックスのすべての列のサイズが小さい
  • sELECTクエリのキャッシュ動作を効果的に管理する
    • アドホッククエリの場合は SQL_NO_CACHE を使用します
    • 頻繁に更新されるデータについては、慎重にキャッシュしてください

四角いペグを丸い穴にフィットさせようとしている場合は、FORCE INDEXでクエリに強制的にインデックスを使用させないでください。言い換えると、特定の順序でテーブルデータにアクセスするためだけにインデックスをトラバースしても、何も買いません。実際、 それはバスの下でクエリパフォーマンスをスローします データがどの程度利用可能である必要があるかについての事前知識を行使しないためです。

9
RolandoMySQLDBA