9

MySQL (5.5.24、WinXP) でインデックスをいじっていますが、使用時にサーバーが 1 つのインデックスを使用しない理由がわかりませんLIKE

例は次のとおりです。

テストテーブルを作成しました:

create table testTable (
  id varchar(50) primary key,
  text1 varchar(50) not null,
  startDate varchar(50) not null
) ENGINE = innodb;

次に、 にインデックスを追加しましたstartDate。(列が日付時刻ではなくテキストである理由を聞かないでください。これは単純なテストです):

create index jeje on testTable(startdate);
analyze table testTable;

その後、約 200,000 行を追加しました。startDateには 3 つの値がありました。(それぞれの登場回数の3分の1..7万回近く)

したがって、次のようにEXPLAINコマンドを実行すると:

explain select * from testTable use index (jeje) where startDate = 'aaaaaaaaa';

答えは次のとおりです。

id = 1
select_type = SIMPLE
type = ref
possible_keys = jeje
key = jeje
rows = 88412
extra = Using where

したがって、キーが使用され、行数が 200,000/3 に近いため、すべて問題ありません。

問題は、クエリを次のように変更した場合 (「=」を「LIKE」に変更するだけ):

explain select * from testTable use index(jeje) where startDate LIKE 'aaaaaaaaa';

この場合、答えは次のとおりです。

id = 1
select_type = SIMPLE
type = ALL
possible_keys = jeje
key = null
rows = 176824
extra = Using where

そのため、インデックスは現在使用されていません (キーは null で、完全なテーブルに近い行.. type=all が示唆するように)。

MySQL のドキュメントによると、LIKE DOES はインデックスを使用します。

それで、私はここで何を見ていませんか?問題はどこだ?

ご協力いただきありがとうございます。

4

2 に答える 2

8

インデックスがテーブル行の 30% 以上にアクセスする場合、MySql はインデックスを無視できます。FORCE INDEX [index_name] を試すことができます。いずれにしてもインデックスが使用されます。

sysvar_max_seeks_for_key の値は、インデックスが使用されるかどうかにも影響します。

SO で同様のリクエストを検索します。

于 2012-08-20T06:30:04.883 に答える
1

Ubik のコメントとデータの変更に基づいて、次のことがわかりました。 インデックス次の場合に使用されます。

- explain select * from testTable force index jeje where startDate like 'aaaaaaadsfadsfadsfasafsafsasfsadsfa%';
- explain select * from testTable force index jeje where startDate like 'aaaaaaadsfadsfadsfasafsafsasfsadsfa%';
- explain select * from testTable force index jeje where startDate like 'aaa';

しかし、このクエリを使用すると、インデックスは使用されません。

- explain select * from testTable force index jeje where startDate like 'aaaaaaaaa';

startDate列のすべての値が同じ長さ (9 文字) で あるという事実に基づいて、LIKE コマンドと 9 文字の定数を使用してクエリを使用すると、おそらくMySQL は何らかのパフォーマンス アルゴリズムのために理由を使用しないことを好みます。テーブルに行きます。

私の懸念は、元のテストで何らかの間違いを犯していないかどうかを確認することでしたが、今ではインデックスとテストが正しく、MySQL が場合によってはインデックスを使用しないことを決定していると思います...そして私は中継しますこれ。

私にとって、これは閉じたタスクです。誰かがスレッドに何かを追加したい場合は、大歓迎です。

于 2012-08-20T14:20:24.237 に答える