web-dev-qa-db-ja.com

MySQLの実行計画は利用可能なインデックスに依存しますか?

MySQLは、使用可能なインデックスを考慮して、特定のクエリの実行プランを選択しますか、それとも最初に実行プランを選択し、使用可能な場合はインデックスを使用しますか?

モチベーション:どのインデックスが役立つかを決定したいと思います。典型的なクエリがいくつかあります。だから私は2つの可能な戦略を想像することができます:

  • プランが使用可能なインデックスに依存していない場合:これらのクエリの実行プランを確認し、これらのプランに役立つインデックスを追加します。
  • プランが利用可能なインデックスに依存している場合:可能なすべてのインデックスを追加し(たくさん!)、クエリのプランを確認し、未使用のインデックスを削除します。

私のDBはそれほど大きくないので、インデックスを操作する余裕があります。私は現在InnoDBを使用していますが、必要に応じてMyISAMなどに切り替えることができます。

5

MySQLのオプティマイザは、使用可能なインデックスのみを調べます。

5.6には例外があります。FROM ( SELECT ... ) JOIN ( SELECT ... ) ...などのサブクエリがある場合、作成される一時テーブルにインデックスはありません。これは、ひどいパフォーマンスにつながるものでした。これで、オプティマイザはさまざまなインデックスを試し、tmpテーブルに最適なインデックスを作成します。 「複合」インデックスではなく、単一列のインデックスのみを探すのではないかと思います。

InnoDBは最近最も注目されています。 MyISAMには、裏技はありません。

私の SELECTを指定して最高のインデックスを作成するためのクックブック を試してください。それはあなたにいくつかの誤ったスタートを節約するかもしれません。

4
Rick James