深入理解MySql索引底层数据结构

文章探讨了不同类型的索引结构,如二叉树、红黑树、B树和B+树,以及哈希树在数据库中的应用。特别提到了B+树在存储大量数据时的优势,以及InnoDB存储引擎中主键和聚集索引的重要性。还讨论了非主键索引如何存储主键值以保持数据一致性和节省空间。
摘要由CSDN通过智能技术生成

结构

二叉树

为什么不使用二叉树为索引?
特点:左边的子节点比父节点小,右边的的子节点比父节点大
为什么不使用二叉树为索引?
如果 顺序排列的话 例如 数据自增
在这里插入图片描述
select * from t where col1 = 6 ,变成一个链表了,树的高度太深
在这里插入图片描述

红黑树

特点:会自动平衡,也是一种二叉树
在这里插入图片描述
为什么不用二叉树做索引
只有两个节点,当数据量很大的时候树的高度会很高很高

B树

特点:
a: 叶节点具有相同的深度,叶节点的指针为空
b:所有的索引元素不重复
c: 节点中的数据索引从左到右递增排列
在这里插入图片描述

B+树

•非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
•叶子节点包含所有索引字段
•叶子节点用指针连接,提高区间访问的性能
在这里插入图片描述

hash 树

•对索引的key进行一次hash计算就可以定位出数据存储的位置
•很多时候Hash索引要比B+ 树索引更高效(一次就可以定位到位置)
•仅能满足 “=”,“IN”,不支持范围查询
•hash冲突问题
在这里插入图片描述

存储引擎

MylSAM

MyISAM索引文件和数据文件是分离的(非聚集)
在这里插入图片描述
索引和数据分开的都是非聚集索引

InnoDB

•表数据文件本身就是按B+Tree组织的一个索引结构文件
•聚集索引-叶节点包含了完整的数据记录
在这里插入图片描述
索引和数据在一起的叫做聚集索引

在这里插入图片描述

联合索引

最左前缀原则
在这里插入图片描述

面试

为什么不用B树 而要用B+树

B+树
在这里插入图片描述
B树
在这里插入图片描述
mysql的一个叶子节点大概是16kb,影响mysql的查询是它的高度,当高度为3的时候b+树大约可以存储 (16kb/14)* (16kb/14)* 16
b树大约可以存储(16kb/1kb)(16kb/1kb)(16kb/1kb) ,B+树显然可以存储更多

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

因为在innoDb内部,你没有建立主键的时候,她会判断你每列是否有全部不重复的数据,如果有,将会作为主键,如果没有会建立一个虚拟的,如果我们建立了主键会节省mysql的性能
整型是因为相比较uuid和其他类型,比较大小的会更快
自增是因为在数据插入的时候只需要顺序插入,如果不是自增数据插入的时候输的结构会拆分重建

为什么InnoDB表非主键索引结构叶子节点的存储的是主键的值

保证数据的一致性和节约存储空间,减少一些数据的冗余

单纯从聚集索引和非聚集索引哪个更快

聚集索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值