一、本文主要讲解的内容有:

  1. 联合索引在B+树上的存储结构
  2. 联合索引的查找方式
  3. 为什么会有最左前缀匹配原则

在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多博客和技术文章,其中有几篇讲述的与事实相悖。庆幸的是看到搜索引擎列出的有一条是来自思否社区的问答,有答主回答了这个问题,贴出一篇文章和一张图以及一句简单的描述。PS:贴出的文章链接已经打不开了。
所以在这样的条件下这篇文章就诞生了。

二、联合索引的存储结构

下面就引用思否社区的这个问答来展开我们今天要讨论的联合索引的存储结构的问题。

来自思否的提问,联合索引的存储结构,有码友回答如下:

联合索引 bcd , 在索引树中的样子如图 , 在比较的过程中 ,先判断 b 再判断 c 然后是 d 。

  • 例子:

首先,表T1有字段a,b,c,d,e,其中a是主键,除e为varchar其余为int类型,并创建了一个联合索引idx_t1_bcd(b,c,d),然后b、c、d三列作为联合索引,在B+树上的结构正如上图所示。联合索引的所有索引列都出现在索引数上,并依次比较三列的大小。上图树高只有两层不容易理解,下面是假设的表数据以及我对其联合索引在B+树上的结构图的改进。PS:基于InnoDB存储引擎

T1表的表数据如下:

bcd联合索引在B+树上的结构图:

我们先看T1表,他的主键暂且我们将它设为整型自增的 (PS:至于为什么是整型自增章《MySQL索引那些事》有详细介绍这里不再多说) ,InnoDB会使用主键索引在B+树维护索引和数据文件,然后我们创建了一个联合索引(b,c,d)也会生成一个索引树,同样是B+树的结构,只不过它的data部分存储的是联合索引所在行的主键值(上图叶子节点紫色背景部分),至于为什么辅助索引data部分存储主键值《MySQL索引那些事》也有介绍,感兴趣或还不知道的可以去看一下。

  • 下面我们结合这两个图来解释一下:
    对于联合索引来说只不过比单值索引多了几列,而这些索引列全都出现在索引树上。对于联合索引,存储引擎会首先根据第一个索引列排序,如上图我们可以单看第一个索引列,横着看,如,1 1 5 12 13....他是单调递增的;如果第一列相等则再根据第二列排序,依次类推就构成了上图的索引树,上图中的b列都等于1时,则根据c排序,此时c列也相等则按d列排序,如:1 1 41 1 5,c=4在c=5前面,以及13 12 4,13 16 1,13 16 5就可以说明这种情况。`

三、联合索引的查找方式

当我们的SQL语言可以应用到索引的时候,比如select * from T1 where b = 12 and c = 14 and d = 3; 也就是T1表中a列为4的这条记录。存储引擎首先从根节点(一般常驻内存)开始查找,第一个索引的第一个索引列为1,12大于1,第二个索引的第一个索引列为56,12小于56,于是从这俩索引的中间读到下一个节点的磁盘文件地址,从磁盘上Load这个节点,通常伴随一次磁盘IO,然后在内存里去查找。当Load叶子节点的第二个节点时又是一次磁盘IO,比较第一个元素,b=12,c=14,d=3完全符合,于是找到该索引下的data元素即ID值,再从主键索引树上找到最终数据。

四、最左前缀匹配原则

之所以会有最左前缀匹配原则和联合索引的索引构建方式及存储结构是有关系的。首先我们创建的index_bcd(b,c,d)索引,相当于创建了(b)、(b、c)(b、c、d)三个索引,看完下面你就知道为什么相当于创建了三个索引。我们看,联合索引是首先使用多列索引的第一列构建的索引树,用上面idx_t1_bcd(b,c,d)的例子就是优先使用b列构建,当b列值相等时再以c列排序,若c列的值也相等则以d列排序。我们可以取出索引树的叶子节点看一下。

索引的第一列也就是b列可以说是从左到右单调递增的,但我们看c列和d列并没有这个特性,它们只能在b列值相等的情况下这个小范围内递增,如第一叶子节点的第1、2个元素和第二个叶子节点的后三个元素。由于联合索引是上述那样的索引构建方式及存储结构,所以联合索引只能从多列索引的第一列开始查找。所以如果你的查找条件不包含b列如(c,d)、(c)、(d)是无法应用缓存的,以及跨列也是无法完全用到索引如(b,d),只会用到b列索引。

五、后记

MySQL索引及知识非常广泛,本文只是涉及到其中一部分。如与排序(ORDER BY)相关的索引优化及覆盖索引(Covering index)的话题本文并未涉及,同时除B-Tree索引外MySQL还根据不同引擎支持的哈希索引、全文索引等等本文也并未涉及。如果有机会,希望再对本文未涉及的部分进行补充吧。

本文转自:https://juejin.im/post/6844904073955639304

mysql联合索引的数据结构相关推荐

  1. MySQL联合索引底层数据结构是怎样的

    目录 1. 联合索引数据结构图 2.联合索引是如何进行排序的 3. 联合索引查询特点 1. 联合索引数据结构图 如下图所示联合索引的数据结构, 通过name,age,position三个字典进行一个联 ...

  2. 找到符合条件的索引_高频面试题:MySQL联合索引的最左前缀匹配原则

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...

  3. mysql联合索引怎么存储_联合索引在B+树上的存储结构及数据查找方式

    能坚持别人不能坚持的,才能拥有别人未曾拥有的. 关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 引言 上一篇文章<MySQL索引那些事>主要讲了MySQL索引的底层原理,且对比了 ...

  4. Mysql 联合索引

    联合索引底层数据结构 MySQL可以使用多个字段同时建立一个索引,叫做联合索引.上文中讲到索引的底层结构就是一个二叉树,联合索引也是一样,它的非叶子节点中存的就不只是一个列,是索引的所有列,并且它的排 ...

  5. 深入浅析Mysql联合索引原理 之 最左匹配原则。

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和大牛交流中,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...

  6. mysql 联合索引详解

    mysql 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). ...

  7. mysql联合索引测试

    mysql联合索引和查询条件的匹配原则: 只有当联合索引的第一个字段在where条件中出现时,才会使用索引查询,不然就是全表扫描查询. 表的索引为: KEY `Index_query` (`trans ...

  8. mysql 联合索引 range_MySQL 联合索引使用情况

    验证联合索引使用的情况 索引是一个排序的结构,用于快速检索和加速排序 MySQL表结构 index_test | CREATE TABLE `index_test` ( `c1` char(10) N ...

  9. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...

最新文章

  1. python学习历程-安装篇(一)
  2. 【MFC两种视频图像採集方法】DirectShow与Opencv
  3. 【每日算法】【图论】【最小边覆盖 最小路径覆盖 最小顶点覆盖 最大独立集 最大团】
  4. 南京的学员看过来 | NVIDIA DLI深度学习入门培训
  5. Transformer新内核Synthesizer:低复杂度的attention代替点乘式的注意力机制
  6. 服务器与普通电脑的区别?
  7. java jxl上传excel_JAVA JXL -----excel文件上传和解析
  8. zabbix自动同步ldap帐号到数据库
  9. Qt窗口部件——QWidget
  10. woff字体找不到导致的404错误
  11. 【STM32】STM32驱动 LCD12864程序代码(串行方式)
  12. 【河马】oracle注入工具v1.1,明小子4.5|明小子注入工具 v15.1最新版
  13. 安装多个电脑杀毒软件
  14. 在Vue中同时使用过渡和动画
  15. html5_滑条等其他标签
  16. 邓俊辉数据结构学习笔记3-二叉树
  17. 用了python抢购京东茅台脚本,为什么你还是抢不到茅台?教你这样设置时间,提升成功概率
  18. 北大计算机学霸,揭秘:2018北大在京录取的学霸们有何特长(组图)
  19. 组件测试 软件,测试AUTOSAR软件组件的测试方法及系统专利_专利查询 - 天眼查
  20. 阿里暑期实习生面试经验-数据分析岗位

热门文章

  1. Android Studio在Git上将项目推送到新的Url地址中
  2. (转)怎么实时查看mysql当前连接数
  3. 美国数学月刊问题18-10-31
  4. django下载excel,使用django-excel插件
  5. Android sendevent/getevent 用法
  6. Android 屏幕常亮、低电量监听
  7. JavaScript|拖拽|仿Android手机九点连线开锁
  8. [EF4] CompiledQuery预编译性能提升 + 数据载入之大彻大悟
  9. 换掉flash,flex,用FlashDevelop
  10. 吴恩达 coursera AI 专项二第二课总结+作业答案