0

「abcd」と言うテーブルがあります

内容は以下の通り

ID | email       | 

24 | abcd@g.com  | 
23 | asdsa@gm.com|
32 |asd@ggm.com  |

今、私は(ID、電子メール)にインデックスを作成しました

クエリを実行すると、EXPLAIN SELECT * FROM abcd WHERE ID='23'; インデックスが使用されていることがわかります。

ただし、クエリを EXPLAIN SELECT * FROM abcd WHERE ID LIKE '2%'; に変更すると、

インデックスはもう使用されていません

これはなぜですか?どちらの場合もインデックスを使用するべきではありませんか?

ありがとう

4

2 に答える 2

3

IDが整数型の場合、そのインデックスは文字列インデックスのようには機能しません。内部では10進数は使用されませんが、固定長の2進数表現が使用されます。

考えてみてください。「2%」は次の数値と一致する必要があります。

2
20
200
2000
...

ただし、MySQLエンジンがこれらの表現に対して「2%」を一致させることは必ずしも簡単ではありません。

0x0002
0x0014
0x00C8
0x07D0
0x4E20
...

理論的には、「2%」パターンを内部的に次のように変換できます。

   ID BETWEEN   20 AND   29
OR ID BETWEEN  200 AND  299
OR ID BETWEEN 2000 AND 2999

可能性は非常に低いと思います。

于 2012-06-08T06:54:52.190 に答える
3

MySQL はコストベースのオプティマイザを使用します。インデックスを使用する場合のコストと、インデックスを使用しない場合のコストを比較します。

  • テーブルに行が 3 つしかない場合、インデックスを使用するかどうかはほとんど変わらないため、MySQL はいずれかのプランを選択できます。
  • 統計が正しくないと、インデックスが使用されるべきときに使用されないことがあります。
  • テーブルに 3 つ以上の列があり、数行しかない場合は、すべての行をスキャンする必要があるため (int 型の列では LIKE の最適化が行われないため)、インデックスを使用しない方が安価な場合があります。フルスキャンを実行していてインデックスを使用する利点はほとんどありませんSELECT *(ちなみに、これは悪い習慣です)。

そうは言っても、私はあなたの結果を再現できませんでした。クエリを試したとき、MySQL は常にインデックスを使用していました。

オンラインで参照してください: sqlfiddle

于 2012-06-08T06:45:38.880 に答える