MySQL最左匹配原则,道儿上兄弟都得知道的原则,字节跳动算法工程师面试总结

目录

  • 一、最左匹配原则的原理

  • 二、违背最左原则导致索引失效的情况

  • 三、查询优化器偷偷干了哪些事儿

  • 四、需要你mark的知识点

    • 1、如何通过有序索引排序,避免冗余执行order by

    • 2、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,c)的三种类型的查询中使用。其实这里说的有一点歧义,其实当where条件只有(a,c)时也会走,但是只走a字段索引,不会走c字段。

那么这都是为什么呢?我们一起来看看其原理吧。

一、最左匹配原则的原理

===========================

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值