来自MySQL文档here
任何未跨越WHERE子句中所有AND级别的索引都不用于优化查询。换句话说,为了能够使用索引,必须在每个AND组中使用索引的前缀。
这究竟是什么意思?是否意味着对于要使用的索引,AND查询的每个组件都必须引用该索引?
因此,我们假设我们有一个Person
表,其中包含SID (primary)
,first_name (index)
,last_name
。
这是否意味着对于以下查询
Select * from Person where first_name='foo' and last_name='bar'
不会使用first_name
上的索引?
答案 0 :(得分:2)
AND
群组是一组与AND
合并的比较。如果WHERE
子句使用OR
组合其中的几个,则WHERE (col1 = 1 AND col2 = 2 AND col6 = 10) OR (col1 = '5' AND col4 = 'B' AND col2 = 16)
子句有多个AND组,例如
col1
有两个AND组。有一个小组负责测试col2
,col6
和col1
,另一个小组负责测试col4
,col2
和{{1} }。
因此,如果索引具有在这些组中的每个组中进行测试的前缀,则可以使用该索引。例如,可以使用(col1, col2, col3)
上的索引,因为前缀(col1, col2)
跨越两个组。
答案 1 :(得分:1)
该文件中的陈述颇具误导性。它似乎与给定under that statement的第一个例子直接矛盾。
以下WHERE子句使用索引:
... WHERE index_part1 = 1 AND index_part2 = 2 AND other_column = 3
这里明确指出,即使other_column不是索引的一部分,也会使用索引。然后,混乱是由'AND Group'究竟是什么引起的。 Bamar在他的回答中解释得非常好,所以我不会在这里讨论。但足以说明
Select * from Person where first_name='foo' and last_name='bar'
如果用户提供索引,则first_name ='foo'的行数远小于表中的总行数。
答案 2 :(得分:1)
这里引用的语句是指多列索引或复合索引。
它表示如果您在多个列上创建了索引,则它们应该以相同的顺序显示在和组中。
如果您对col1,col2,col3的索引感兴趣 团体可以
col1=1 and col2=2 and col3=3
你也可以
col1=1 and col2=2
但你不能拥有
col2=1 and col3=3
因为它不是索引的前缀