深入理解Mysql索引底层数据结构与算法

本文详细探讨了MySQL中不同索引结构(如二叉树、红黑树、Hash表、B-Tree和B+Tree)的工作原理及其效率对比。特别关注InnoDB表的存储特点,解释为何主键选择整型自增,以及非主键索引叶子节点存储主键的原因。涵盖了MyISAM和InnoDB表的索引差异和表结构优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引的数据结构

索引是帮助MySQL高效获取数据的排好序的数据结构

常见的索引数据结构

  • 二叉树
  • 红黑树
  • Hash表
  • B-Tree
  • B+Tree

二叉树

红黑树

Hash表

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

B-Tree

  • 叶节点具有相同的深度,叶节点的指针为空
  • 所有索引元素不重复
  • 节点中的数据索引从左到右递增排列

B+Tree

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

高度

表的索引类型

MyISAM

myisam在磁盘存储上有三个文件,每个文件名以表名开头,扩展名指出文件类型。

.frm 用于存储表的定义

.MYD 用于存放数据

.MYI 用于存放表索引(存放的是物理地址) 找到索引后需要再进行一次内存寻址(非聚集

InnoDB

表数据文件本身就是按B+Tree组织的一个索引结构文件
聚集索引-叶节点包含了完整的数据记录

.frm 用于存储表的定义

.idb用于存放表索引+数据(聚集)

叶子指针=区间查找

例如50>col>20 ;分页优化

SHOW GLOBAL STATUS like 'Innodb_page_size';

SHOW GLOBAL STATUS like 'Innodb_page_size';

1170x1170x16 = 几千万 只需要 h=3即可

8B+6B(bigint+地址空间大小)


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

  • 主键

因为数据库再寻址的时候使用的是主键寻址,也就是你主键你如果没有创建的话,数据引擎会自己常见数据表的主键,

方法是使用寻去任意一列没有重复的,作为主键,如果有没有的话,会创建一个隐藏的主键

  • 整型

B+树进行寻址的时候,会进行比较

  1. 比大小,整数比字符或者其他类型比较大小会快;字符也是只是比较长度,然后字符也会进行Ascii(美国信息交换标准代码)进行比较(个人猜测)
  2. 再来,字符所占用的空间大小要比整型大,也就是节省空间省钱(SSD)
  • 自增

如果是自增的时候就直接对数据进行,累加接入到4->5的后面即可,4->5->6,不许动其他的元素


当我不是自增的时候,B+树会进行平衡操作,会改变树的结构例下图,本来4->6的但是再插入5的时候就要对指针重新链接4->5->6


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

(一致性和节省存储空间)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大数据精读周刊

喝杯咖啡????

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

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

打赏作者

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

抵扣说明:

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

余额充值