MySQL EXPLAIN:“使用索引”与“使用索引条件”

时间:2009-11-06 13:18:46

标签: mysql optimization

MySQL 5.4 documentation, on Optimizing Queries with EXPLAIN,关于这些额外评论说:

  
      
  • 使用索引
  •   
     

检索列信息   从表中仅使用信息   在索引树中无需做   另外寻求阅读实际   行。这个策略可以在何时使用   查询仅使用列   单个索引的一部分。

     

[...]

     
      
  • 使用索引条件
  •   
     

通过访问索引来读取表   元组并首先测试它们   确定是否读取全表   行。这样,索引信息   用于推迟(“下推”)阅读   除非它是全表行   必要的。

我错过了什么,或者这两个意思相同(即“没有读取行,索引就够了”)?

2 个答案:

答案 0 :(得分:68)

一个例子最好地解释了:

SELECT Year, Make --- possibly more fields and/or from extra tables
FROM myUsedCarInventory
WHERE Make = 'Toyota' AND Year > '2006'

Assuming the Available indexes are:
  CarId
  VIN
  Make
  Make and Year

此查询将使用'使用索引'进行解析,因为它不需要在所有,“点击”myUsedCarInventory表本身,因为“Make and Year”索引“覆盖”了它的需要关于与该表相关的WHERE子句的元素

现在,想象一下,我们保持查询相同,但是为了在颜色上添加条件

...
WHERE Make = 'Toyota' AND Year > '2006' AND Color = 'Red'

此查询可能会使用“使用索引条件”进行检索(“可能”,这里的情况是丰田+年份估计不够有选择性,优化程序可能决定只扫描表格)。这意味着MySQL将 FIRST 使用索引来解析Make + Year,并且还必须查找表中的相应行, 仅用于 满足Make + Year条件的行。这有时被称为“push down optimization”。

答案 1 :(得分:6)

不同之处在于“使用索引”不需要从索引到表的查找,而“使用索引条件”有时必须。我将尝试用一个例子来说明这一点。假设你有这张桌子:

id, name, location

索引

name, id

然后这个查询不需要任何表格,它可以检索它的所有信息“使用索引”:

select id, name from table where name = 'Piskvor'

但是这个查询需要对名称等于'Piskvor'的所有行进行表查找,因为它无法从索引中检索位置:

select id from table where name = 'Piskvor' and location = 'North Pole'

查询仍然可以使用索引将结果限制为具有特定名称的小行集,但是必须查看表中的那些行以检查位置是否也匹配。