为啥这个查询使用 where 而不是索引?

Posted

技术标签:

【中文标题】为啥这个查询使用 where 而不是索引?【英文标题】:Why is this query using where instead of index?为什么这个查询使用 where 而不是索引? 【发布时间】:2010-11-10 00:40:32 【问题描述】:
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   

【问题讨论】:

【参考方案1】:

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

例如,filesort 与文件无关,using where 并不意味着您正在使用WHERE 子句,using index 可以出现在没有定义单个索引的表上。

Using where 只是表示表上有一些限制子句(WHEREON),并且不会返回所有记录。请注意,LIMIT 不算作限制子句(尽管可以)。

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

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

【讨论】:

Using where ; Using index 出现是什么意思?也许你可以回答这个***.com/questions/41620312/…【参考方案2】:

实际上是使用索引category_id_2

【讨论】:

但它最后说Using where....也许我误解了它的目的。【参考方案3】:

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

Using where 仅表示您使用WHERE 语句仅选择了一些行,因此您不会取回整个表;)

【讨论】:

以上是关于为啥这个查询使用 where 而不是索引?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 为啥总是推荐使用联合索引而不是单值索引

当我使用“或”条件时,为啥我的查询使用过滤而不是索引条件?

为啥当 WHERE 子句包含参数化值时 SQL Server 使用索引扫描而不是索引查找

为啥 oracle 对此查询使用索引跳过扫描?

sqlwhere后可以有多个条件后再嵌套吗

sqlserver 在数据查询时是按时间顺序排列的 在时间字段上还有必要加聚集索引吗 为啥