考虑以下两个EXPLAIN:
EXPLAIN SELECT * FROM sales WHERE title != 'The'
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sales ALL title NULL NULL NULL 41707 Using where
和 -
EXPLAIN SELECT * FROM sales WHERE title = 'The'
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sales ref title title 767 const 1 Using where
为什么!=
查询有NULL
个密钥?为什么不使用title
?是什么导致=
语句能够使用索引而不是!=
?
答案 0 :(得分:11)
使用索引没有意义,除非title
非常频繁'The'
。
由于几乎每一行都需要选择,因此您无法获得使用索引的任何内容。使用索引实际上可能成本很高,这可能是您的MySQL引擎正在确定的索引,因此它选择不使用索引。
比较在这两种情况下完成的工作量:
使用索引:
1)将整个索引树读入内存 2)在索引树中搜索值“The”并过滤掉这些条目 3)读取每一行,除了少数例外(可能在磁盘上的相同块中,与需要读取的行相同,因此实际上整个表可能被读入)从表中进入内存。
没有索引:
1)将每一行读入内存,并在读取它们时过滤掉结果集中
title
='The'
的任何位置