为什么这个查询使用了where而不是索引?

4
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个回答

4
EXPLAIN 的输出有时会误导人。例如,filesort 与文件无关,using where 并不意味着你正在使用 WHERE 子句,using index 可以出现在没有定义单个索引的表中。 Using where 只是表示表上有一些限制性子句(WHEREON),并且不会返回所有记录。请注意,LIMIT 不算作限制性子句(尽管它可以)。 Using index 表示从索引中返回所有信息,而不是在表中查找记录。只有在查询所需的所有字段都被索引覆盖的情况下才可能实现这一点。由于您选择了 *,这是不可能的。除了 category_idboard_iddisplayorder 这几个字段外,其他字段都没有被索引覆盖,需要进行查找。

当出现 Using where; Using index 是什么意思?也许你可以回答这个问题:http://stackoverflow.com/questions/41620312/mysql-not-picking-correct-row-count-from-index - Nikhil Sahu

0

它实际上是使用索引 category_id_2


但是它在结尾处说“使用where”...也许我误解了它的目的。 - Ben

0

它正在正确使用索引category_id_2,正如EXPLAINkey字段所示。

Using where只是意味着您正在使用WHERE语句仅选择一些行,因此您将不会得到整个表格;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接