我一直在使用 MySQL(5.5.24,WinXP)上的索引,但我找不到在使用 a 时服务器不使用一个索引的原因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 个可能的值。(每一个出现三分之一......接近70,000次)
所以,如果我运行这样的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
因此,现在没有使用索引(键为空,并且行接近完整表......正如 type=all 所暗示的那样)。
MySQL 文档说 LIKE 确实使用了索引。
那么,我在这里没有看到什么?哪里有问题?
谢谢你的帮助。