37

これは私が永遠に持っていた質問です。

私の知る限り、インデックスの順序は重要です。だから、のようなインデックス[first_name, last_name] は、と同じではありません[last_name, first_name]よね?

最初のインデックスのみを定義する場合、それは次の目的でのみ使用されることを意味しますか?

SELECT * FROM table WHERE first_name="john" AND  last_name="doe"; 

ではなく

SELECT * FROM table WHERE  last_name="doe" AND first_name="john";

ORMを使用しているので、これらの列がどの順序で呼び出されるのかわかりません。それは、すべての順列にインデックスを追加する必要があることを意味しますか?これは、2列のインデックスがある場合は実行可能ですが、インデックスが3列または4列の場合はどうなりますか?

4

3 に答える 3

63

クエリ条件がインデックスの一部にのみ適用される場合、インデックスの順序が重要になります。検討:

  1. SELECT * FROM table WHERE first_name="john" AND last_name="doe"

  2. SELECT * FROM table WHERE first_name="john"

  3. SELECT * FROM table WHERE last_name="doe"

インデックスが(first_namelast_name)の場合、クエリ1と2はそれを使用しますが、クエリ#3は使用しません。インデックスが(last_namefirst_name)の場合、クエリ1と3はそれを使用しますが、クエリ#2は使用しません。WHERE句内で条件の順序を変更しても、どちらの場合も効果はありません。

詳細はこちら

更新
上記が明確でない場合-MySQLは、クエリ条件の列がインデックスの左端のプレフィックスを形成する場合にのみインデックスを使用できます。上記のクエリ#2は、(、 )インデックスのみに基づいており、( 、 )インデックスの左端のプレフィックスではないため、( last_name、 )インデックスを使用できません。first_namefirst_namefirst_namelast_namefirst_name

クエリ内の条件の順序は重要ではありません。上記のクエリ#1は、条件が であり、一緒になって( 、 )インデックスの左端のプレフィックスを形成するため、( last_name、 )インデックスを問題なく使用できます。first_namefirst_namelast_namelast_namefirst_name

于 2009-08-09T21:05:44.073 に答える
5

ChssPly76は、ブール式の順序がインデックスの列の順序と一致する必要がないことを正しく示しています。ブール演算子は可換であり、MySQLオプティマイザーは、ほとんどの場合、式をインデックスに一致させる方法を知っているほど賢いです。

EXPLAINまた、MySQLの機能の使用方法を学習して、オプティマイザーが特定のクエリに対してどのインデックスを選択するかを自分で確認できるようにする必要があることも付け加えておきます。

于 2009-08-09T22:21:21.500 に答える
3

答えを少し拡張して、すべてを一度に完全に明確にしてみませんか。

テーブルに複数列の索引がある場合、オプティマイザーは索引の左端の接頭部を使用して行を見つけることができます。たとえば、に3列のインデックスがある場合、、、および(col1, col2, col3)に検索機能のインデックスを(col1)作成します。(col1, col2)(col1, col2, col3)

列がインデックスの左端のプレフィックスを形成していない場合、MySQLはインデックスを使用できません。ここに示されているSELECTステートメントがあるとします。

SELECT * FROM tbl_name WHERE col1=val1;
SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

SELECT * FROM tbl_name WHERE col2=val2;
SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

にインデックスが存在する場合(col1, col2, col3)、最初の2つのクエリのみがインデックスを使用します。3番目と4番目のクエリにはインデックス付きの列が含まれますが、の左端のプレフィックスではありませ(col2)ん。-MySQL開発者(col2, col3)(col1, col2, col3)

于 2014-04-06T12:15:52.773 に答える