自MySQL5.5版本起,主流的索引结构转为B+树。B+树的节点存储索引顺序是从左向右存储,在检索匹配的时候也要满足自左向右匹配。
目录
- 一、最左匹配原则的原理
- 二、违背最左原则导致索引失效的情况
- 三、查询优化器偷偷干了哪些事儿
- 四、需要你mark的知识点
- 1、如何通过有序索引排序,避免冗余执行order by2、like 语句的索引问题3、不要在列上进行运算4、索引不会包含有 NULL 值的列5、尽量选择区分度高的列作为索引6、覆盖索引的好处
通常我们在建立联合索引的时候,相信建立过索引的同学们会发现,无论是Oracle还是 MySQL 都会让我们选择索引的顺序,比如我们想在a,b,c三个字段上建立一个联合索引,我们可以选择自己想要的优先级,(a、b、c),或是 (b、a、c) 或者是(c、a、b) 等顺序。
为什么数据库会让我们选择字段的顺序呢?不都是三个字段的联合索引么?这里就引出了数据库索引的最重要的原则之一,最左匹配原则。
在我们开发中经常会遇到这种问题,明明这个字段建了联合索引,但是SQL查询该字段时却不会使用这个索引。难道这索引是假的?白嫖老子资源?!
比如索引abc_index:(a,b,c)是a,b,c三个字段的联合索引,下列sql执行时都无法命中索引abc_index;
select * from table where c = '1';
select * from table where b ='1' and c ='2';
以下三种情况却会走索引:
select * from table where a = '1';
select * from table where a = '1' and b = '2';
select * from table where a = '1' and b = '2' and c='3';
从上面两个例子大家有木有看出点眉目呢?
是的,索引abc_index:(a,b,c),只会在where条件中带有(a)、(a,b)、(a,b