MySQL联合索引的原理

面试中被问到了联合索引,突然就涉及到了知识盲区,对不起,我只知道B+树,B树,哈希索引,聚簇索引,非聚簇索引,联合索引的原理?。。

对不起涉及到了我的知识盲区了。

这涉及到了我的知识盲区 憨憨猫表情包_盲区_知识_涉及表情

 

这里对联合索引做一个总结,联合索引,顾名思义,普通的索引我们只会对单个字段去构建索引,又分为主键索引和辅助索引,那么联合索引就是对多个字段去构建索引,

从而在某些场景下提升提升查询效率。

 

最左匹配原则

  提到联合索引,不得不提的就是最左匹配原则

  所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。

 

假设,我们对(a,b)字段建立一个索引,也就是说,你where后条件为

a = 1
a = 1 and b = 2

是可以匹配索引的,因为他们都遵循了最左匹配原则。但是要注意的是~你执行

b= 2 and a =1

也是能匹配到索引的,有的小伙伴就会有疑问了,这里没有遵循最左匹配原则呀,不用担心,MySQL内部有一个优化器,Mysql的优化器会自动调整a,b的顺序与索引顺序一致。 相反的,你执行

b = 2

就匹配不到索引了。 而你对(a,b,c,d)建立索引,where后条件为

a = 1 and b = 2 and c > 3 and d = 4

那么,a,b,c三个字段能用到索引,而d就匹配不到。因为遇到了范围查询,当遇到范围查询(>、<、between、like)就会停止匹配。!

 

联合索引的原理和数据结构

OK,知道了联合索引的最左匹配原则,那它的数据结构和原理是什么样子的呢。

其实它的结构和普通索引一样,还是B+树,但是细节上还是有些不一致的。

虽然依然是B+树,但联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。

这里引用一些大神们的图

 

preview

如图所示他们是按照a来进行排序,在a相等的情况下,才按b来排序。

因此,我们可以看到a是有序的1,1,2,2,3,3。而b是一种全局无序,局部相对有序状态! 什么意思呢?

从全局来看,b的值为1,2,1,4,1,2,是无序的,因此直接执行b = 2这种查询条件没有办法利用索引。

从局部来看,当a的值确定的时候,b是有序的。例如a = 1时,b值为1,2是有序的状态。当a=2时候,b的值为1,4也是有序状态。 因此,你执行a = 1 and b = 2是a,b字段能用到索引的。而你执行a > 1 and b = 2时,a字段能用到索引,b字段用不到索引。因为a的值此时是一个范围,不是固定的,在这个范围内b值不是有序的,因此b字段用不上索引。

综上所示,最左匹配原则,在遇到范围查询的时候,就会停止匹配。

所以根据联合索引的最左匹配原则,我们在构建联合索引的时候,要把区分度高的字段,放在最左侧。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: MySQL索引原理是通过在表中创建索引来提高查询效率。索引是一种数据结构,它包含了指向实际数据的指针,可以加快数据的查找和访问速度。MySQL中常见的索引类型包括主键索引、普通索引、唯一索引和空间索引等。主键索引是一种特殊的唯一索引,要求键值不能为空。普通索引没有任何限制。联合索引是多个字段创建的索引,使用时遵循最左前缀原则。唯一索引要求索引列中的值必须是唯一的,但允许为空值。空间索引MySQL5.7之后支持的一种索引类型,用于处理空间数据。此外,还有一种特殊的索引叫做聚集索引,它的索引键值的逻辑顺序与表数据行的物理存储顺序一致。\[2\]\[3\]在使用索引时,需要注意一些情况可能导致索引失效,比如查询条件中包含or、字段类型是字符串但没有用引号括起来、like条件中前面带%、联合索引中查询条件列不是第一个列、在索引列上使用MySQL的内置函数或列运算、字符串不加引号、负向查询、使用is null或is not null等。此外,MySQL还有一个优化策略,即当MySQL估计使用全表扫描比使用索引快时,会选择不使用索引。\[1\] #### 引用[.reference_title] - *1* *2* *3* [MySQL 索引原理](https://blog.csdn.net/qq_35958391/article/details/124386023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值