没有索引!=?

时间:2012-06-12 00:16:03

标签: mysql sql performance database-performance

考虑以下两个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?是什么导致=语句能够使用索引而不是!=

1 个答案:

答案 0 :(得分:11)

使用索引没有意义,除非title非常频繁'The'

由于几乎每一行都需要选择,因此您无法获得使用索引的任何内容。使用索引实际上可能成本很高,这可能是您的MySQL引擎正在确定的索引,因此它选择不使用索引。

比较在这两种情况下完成的工作量:

使用索引:

  

1)将整个索引树读入内存      2)在索引树中搜索值“The”并过滤掉这些条目      3)读取每一行,除了少数例外(可能在磁盘上的相同块中,与需要读取的行相同,因此实际上整个表可能被读入)从表中进入内存。

没有索引:

  

1)将每一行读入内存,并在读取它们时过滤掉结果集中title = 'The'的任何位置