2

a、b、c の 3 つの列があり、(a、b、c) としてインデックスを付けました。私はこのようなクエリを持っています:

SELECT * FROM tablename WHERE a=something and c=someone

私の質問は、このクエリはこのインデックスを使用するかどうかです!?

4

2 に答える 2

4

インデックスの 1 列目 ( a) は使用できますが、3 列目 ( ) は使用できませんc

1 つの方法は、EXPLAIN の出力です。

次に例を示します。

mysql> create table tablename (a int, b int, c int, key (a,b,c));
...I filled it with some random data...

mysql> explain SELECT * FROM tablename WHERE a=125 and c=456\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tablename
         type: ref
possible_keys: a
          key: a
      key_len: 5
          ref: const
         rows: 20
        Extra: Using where; Using index

上記はref: const、インデックス内の行を検索するために定数値の 1 つだけが使用されていることを示しています。また、key_len: 53 つの整数を含むインデックス エントリは 5 バイトより大きくなければならないため、インデックスのサブセットのみが使用されていることを示しています。

mysql> explain SELECT * FROM tablename WHERE a=125 and b = 789 and c=456\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tablename
         type: ref
possible_keys: a
          key: a
      key_len: 15
          ref: const,const,const
         rows: 1
        Extra: Using index

3 つの列すべてで条件を使用すると、ref: const,const,const3 つの値すべてがインデックス エントリの検索に使用されていることがわかります。はkey_len3 つの整数のエントリに十分な大きさです。

于 2013-10-20T20:04:31.617 に答える
0

Mihal が言うように、クエリの前に EXPLAIN を付けると、オプティマイザーはインデックスを使用するかどうかを通知します。Bill は、インデックス内の a の値のみを検索するという点で部分的に正しいですが、テーブルに列 a、b、および cのみが含まれている場合、インデックスはカバーされ、b および c の値はから取得されます。テーブル データを参照せずにインデックスを作成しますが、DBMS はインデックス内の b と c のすべての値をスキャンします。c に指定された値に直接アクセスするだけではありません。

b が整数であると仮定すると、より深いインデックスを使用するようにクエリをごまかすことができる場合があります。

SELECT * 
FROM tablename 
WHERE a='something'
AND b BETWEEN -8388608 AND 8388607 
AND c='someone'
于 2013-10-20T20:16:28.163 に答える