澄清MySQL索引需要“跨越”所有“和组”

时间:2016-11-24 04:38:07

标签: mysql indexing

来自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上的索引?

3 个答案:

答案 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组。有一个小组负责测试col2col6col1,另一个小组负责测试col4col2和{{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

因为它不是索引的前缀