... WHERE index_part1=1 AND index_part2=2 AND other_column=3 /* index = 1 OR index = 2 */ ... WHERE index=1 OR A=10 AND index=2 /* 优化了 like "index_part1='hello'" */ ... WHERE index_part1='hello' AND index_part3=5 /* 使用索引 index1,但没有用到 index2 或 index3 */ ... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3; |
以下 WHERE 子句不使用索引:
/* 没用到 index_part1 */ ... WHERE index_part2=1 AND index_part3=2 /* 所有的 AND 部分没用到索引 */ ... WHERE index=1 OR A=10 /* 索引没有跨越全部字段 */ ... WHERE index_part1=1 OR index_part2=10 |
有些时候尽管有可用的索引,MySQL也不会用到它们。一种情况是优化程序认为如果使用索引会需要检索更大部分的表记录(这时候,扫描表可能更快,因为这支需要更少的搜索)。尽管如此,如果有一个查询用 LIMIT 限制只检索部分记录,MySQL就一定会使用索引,因为这样能更快检索到更少记录来返回给结果。
以下是哈希索引的一些不同的特性:
它们只用于 = 或 <=> 比较(但并不很快)。
优化程序无法使用哈希索引来加速 ORDER BY 操作(这种索引不能用于按顺序搜索下一个记录)。
MySQL大致无法判断出介于两个值之间有多少记录(这由范围优化程序来决定使用哪个索引)。这在把 MyISAM 表类型改为采用哈希索引的 MEMORY 类型后可能会影响一些查询。
只有全部索引键才能用于检索记录(如果是B树索引,任何前缀部分索引也能用于检索记录)。

