mysql索引数据结构详解

笔者之前面试的时候被问到了一些关于mysql索引的一些问题,像是B+树对于B树的优点在哪?为什么使用InnoDB引擎会推荐使用整形的自增字段作为主键之类的,当时回答的模糊不清,最近整理了下资料,来详细的阐述的一下mysql索引的数据结构到底是怎么样的。


一、索引是什么?

索引是一种排好序数据结构,它主要使用来帮助提升sql的查询效率的。

二、为什么使用了索引后查询数据会变快?

使用了索引后,数据库查询出数据的遍历次数比不加索引的时候会减少很多,这样就很大的提高了查询的 速率。下面有一幅图给出了很直观的对比:
在这里插入图片描述

三、B+树是什么?为什么mysql要选用B+树?

B+树也是一种数据结构,它相较于它的前身B树对数据的存储上做了跟进一步的优化,它规定了它的叶子节点只存储索引key,非叶子节点才会存放索引和数据,使得同样的内存空间可以存放更多的索引,从而大大节省了内存的开销。它还在同一高度的叶子结点间添加了链指针从而让数据的范围查询更加高效,下面也有两幅图给出了很直观的体现:

B树的结构:
在这里插入图片描述
B+树的结构:
在这里插入图片描述

四、索引中的hash索引是什么?

hash索引是也是一种数据结构,它将查询条件通过hash算法算出hash值后再到对应hash值的位置去查找对应的数据,它只维护了一个索引链,所有的数据都以链表的像是存储在对应哈希值的后面,下面又一个非常形象的图:
在这里插入图片描述
很多时候hash索引的查询效率比B+树的更高,但是hash索引的局限性也很大,导致了它使用的次数是非常少,下面列出几点它的局限:

  • 1、它仅能满足“=”、“in”的查询条件,不支持范围查询;
  • 2、可能会有hash冲突的问题;

五、什么是聚集索引?什么又是非聚集索引?

聚集索引指的是索引和数据放在一起的索引结构,非聚集索引就是索引和数据不放在一起的数据结构。
MyISAM数据库引擎使用的索引就是非聚集索引,它的索引文件和数据文件是分开存放的;而InnoDB的索引和数据是存放在一起的,所以它就是聚集索引。

六、为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

由于本身存储结构的需要,InnoDB引擎需要使用主键来创建B+树数据结构的存储文件,如果建表时没有创建主键的话,InnoDB会自动选取表中数据全不相同的一列来作为主键来达成存储需求;若是没有数据全都不相同的一列的话,InnoDB会自动创建一个隐藏列来达成存储目标。这就大大加大了数据库资源的消耗,所以一般都是推荐InnoDB表必须建主键。

而为什么要选取自增的整形来作为主键,也还是为了减少性能开销做出的建议。InnoDB引擎在存储数据的时候,会对整个数据结构进行优化,如果你存入的数据索引在之前的两个索引之间的话,它会耗费一部分资源来对整个数据结构进行优化,而如果存入的是自增整型的话,就可以直接将数据放到后续分支上就行,从而减少了不必要的资源消耗。

七、为什么非主键索引结构叶子节点存储的是主键值?

最主要的原因是为了减少对存储空间的消耗,如果每一个索引都存储了所有的数据的话,这会占用更大的存储资源,从而降低了数据库的存储数据量。
一般来说查询条件是非主键索引的时候,InnoDB引擎会先找到查询条件所对应的那个主键,然后再从主键索引结构中查找出真正的数据。

八、什么是联合索引?它的存储结构是什么样的?它为什么一定要符合最左前缀原理?

联合索引就是将几个创建索引列的数据按顺序放在一起组成一个索引来搭建整体的索引数据结构的,下方的图给出了一个很直观的体现:
在这里插入图片描述
它之所以要符合最左前缀原理,是因为要是不符合最左前缀原理还按照当前联合索引的索引结构去查找数据的话,可能还是要进行全表扫描,这就不符合索引定义的前提(优化查询结构)了。所以在此时InnoDB会把不符合最左前缀原理的查询按照原来的查询方式进行查询(因为此时索引的效率和原查询的效率一样)。

举个例子:查询条件是age等于30,position等于dev,此时走联合索引的结构的话,按上图它需要查询两次以上,因为不确定其他地方是否符也存在两者条件一致的存储区域,所以每个存储区域都需要扫描;而如果使用了name的作为条件的话,像是name等于Bill,position等于dev,由于B+树已经排好序的原因,只要第一个条件存在,那么之后就不可能出现ASCII和此块数据区域相近却不在它附近的情况,这样就不用全表扫描,只需要查询它附近的数据就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缘丶沐逸尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值