MySQL 5.4 documentation, on Optimizing Queries with EXPLAIN,关于这些额外评论说:
- 使用索引
检索列信息 从表中仅使用信息 在索引树中无需做 另外寻求阅读实际 行。这个策略可以在何时使用 查询仅使用列 单个索引的一部分。
[...]
- 使用索引条件
通过访问索引来读取表 元组并首先测试它们 确定是否读取全表 行。这样,索引信息 用于推迟(“下推”)阅读 除非它是全表行 必要的。
我错过了什么,或者这两个意思相同(即“没有读取行,索引就够了”)?
答案 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'
查询仍然可以使用索引将结果限制为具有特定名称的小行集,但是必须查看表中的那些行以检查位置是否也匹配。