2016-12-01 6 views
2

は、私は3列(C1、C2、C3)とテーブル(T1)をしましたと仮定し、私はこのようなインデックスを追加しました:クエリの最後のフィールドがMySQLの場合、必要なインデックスはテーブルのカラムですか - MySQL?

ALTER TABLE `t1` ADD INDEX `IDX_c1_c2` USING BTREE (`c1`, `c2`); 
私は私が作る場合は、このクエリがインデックスを使用することを知っている

とを

SELECT * FROM `t1` where c1 = "foo" AND c2 = "bar" 

しかし、何このクエリについて?:

SELECT * FROM `t1` where c1 = "foo" AND c2 = "bar" AND c3 = "foobar" 

MySQLのエンジンは、クエリを改善するために、またはインデックスを無視するために、インデックスを使用します:完璧な作品?つまり、クエリ全体がインデックスと一致してインデックスを使用する必要があります。または、クエリの最初の2つのカラムのインデックスを利用できます。

[UPDATE] - 最後のクエリは、実際には、この(日付は単なる一例である)のようになります。

SELECT * FROM `t1` where c1 = "foo" AND c2 = "bar" AND c3 > "2016-11-26 07:37:47" 

答えて

1

だけで物事をシンプルにするために、あなたのexisitingインデックスはまだ使用されます、しかし、 3列目は独立して解決されます。クエリプロセッサによっていくつかのプランが生成され、最適なプランがエンジンによって受け入れられて処理されます。まだ3列目を指標にしても、パフォーマンスは自慢です。

提案 あなたが等価条件を使用している場合は、ハッシュベースのインデックス付けのために行くの照会ではなくBツリー

+1

答えをいただきありがとうございます、投稿を編集しました。更新を見て、最後のクエリは日付の '>'演算子を使用します。私はそれが最初の2つの列で検索を洗練させたいと思うので、日付を見るために結果のサイズがずっと小さいので、それは良いアイデアのインデックスではないと思います。 – Fco

+0

私が知る限り、索引の先頭には2つしかありません。更新するフィールドが増え、スペースが多く消費されるため、書き込み操作に時間がかかります。それ以外には問題はありません。 3つすべてがクエリで実行されている場合は、3番目の列インデックスを作成する際に問題が表示されません。しかし、あなたのシステムが既存の設計とうまく動作しているなら、今すぐ変更しないでください。 –

+0

ハッシュインデックスは、ポイントクエリに対してBTreeよりわずかに高速です。しかし、ハッシュはMySQLでは利用できません。 (OK、1つの例外があります。) –

0

This cookbookは、これらの質問にすべての答えを提供し、加えて、より多くの。

  • INDEX(c1, c2)(いずれの順番でも)は、これらすべての場合に有効です。
  • (c1, c2, c3)これらすべてのケースで機能します。 2位と3位の方が優れています。同義語は(c2, c1, c3)です。
  • 他の順序は、あなたの第三のクエリのためにうまく動作しません - =パーツが最初に来なければならない、ではない「範囲」

(例えば>など)ボーナス:実際には、これらの3つの列がである場合テーブルの場合、(c1, c2, c3)は「カバリング」です。つまり、インデックスBTree内のクエリ全体を実行でき、データBTreeに触れる必要はありません。

関連する問題