为什么这个查询使用where而不是index?

时间:2010-11-10 00:40:32

标签: mysql query-optimization

EXPLAIN EXTENDED SELECT  `board` . * 
FROM  `board` 
WHERE  `board`.`category_id` =  '5'
AND  `board`.`board_id` =  '0'
AND  `board`.`display` =  '1'
ORDER BY  `board`.`order` ASC

上述查询的输出是

id  select_type table   type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  board   ref category_id_2   category_id_2   9   const,const,const   4   100.00  Using where

我对此感到有点困惑,因为我有一个索引,其中包含我使用的列,它们与查询中使用的列相同...:

category_id_2   BTREE   No  No 
category_id 33  A       
    board_id    33  A   
    display 33  A   
    order   66  A   

3 个答案:

答案 0 :(得分:4)

EXPLAIN的输出有时会产生误导。

例如,filesort与文件无关,using where并不意味着您使用的是WHERE子句,using index可以显示在表格中单个索引已定义。

Using where只是意味着表格中有一些限制条款(WHEREON),并且不会返回所有记录。请注意,LIMIT不算作限制条款(尽管可以)。

Using index表示从索引返回所有信息,而不查找表中的记录。只有在索引覆盖查询所需的所有字段时才可以这样做。

由于您选择*,这是不可能的。索引不涵盖category_idboard_iddisplayorder以外的字段,应该查找。

答案 1 :(得分:0)

它实际上是使用索引category_id_2

答案 2 :(得分:0)

正确使用索引category_id_2,如key的{​​{1}}字段所示。

EXPLAIN只是意味着您只使用Using where语句选择了一些行,因此您无法获得整个表格;)