第七节:复合索引,索引最左匹配原则
1、单一索引和复合索引
单一索引是指索引列为一列的情况,另外,用户可以在多个列上建立索引,这种索引叫做复合索引,也叫组合索引。
复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。
2、建立复合索引
创建索引:
create index idx1 on table1(col1,col2,col3)
查询(使用索引):
select * from table1 where col1= A and col2= B and col3 = C
这时候查询优化器,不在扫描全表,而是利用索引查询。
3、复合索引的使用注意事项:索引最左匹配原则
对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高,例如:select * from table1 where col1=A AND col2=B AND col3=D。如果使用 where col2=B AND col1=A 或者 where col2=B 将不会使用索引。
mysql创建复合索引的规则是首先会对复合索引的最左边的,也就是第一个name字段的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个的age字段进行排序。
其实就相当于实现了类似 order by name age这样一种排序规则。
所以:第一个name字段是绝对有序的,而第二字段就是无序的了。所以通常情况下,直接使用第二个age字段进行条件判断是用不到索引的, 这就是所谓的mysql为什么要强调最左前缀原则的原因。
那么什么时候才能用到age字段的索引呢? 前提当然是age字段的索引数据也是有序的情况下才能使用咯,什么时候才是有序的呢?观察可知,是在name字段是等值匹配的情况下,age才是有序的。
这也就是mysql索引规则中要求复合索引要想使用第二个索引,必须先使用第一个索引的原因,而且第一个索引必须是等值匹配。
"where col2=B AND col1=A"这里还是会用到索引的最左匹配的吧,它会被编译器调整顺序的
你说的很对。这个问题早就发现了,之所以没有做修订,是因为不想挖的太深,否则不利于初学者对最左匹配的感性认知。