当前位置: 首页 > news >正文

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

索引是什么?

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

常见的数据结构

  • 二叉树
  • 红黑树
  • Hash表
  • B Tree
  • B+ Tree(B Tree的变种)

二叉树

缺点:对于自增的序列, 其二叉树中任何节点都没有左子树, 是一个单边增长的结构。作为索引数据结构的话,此时性能很差。

红黑树

缺点: 高度不可控,且随着数据量的增加,高度越来越深。

Hash表

缺点:

  • Hash表是根据key值求hash值定位到具体位置, 只能满足sql的=、in 的操作,无法满足范围查询
  • hash冲突问题

B Tree

1、分析B Tree的数据表可以存储多大的数据量:

        一个节点对应一个数据页(Mysql磁盘页大小默认16KB), 假设主键是bigint类型占8字节,指针6字节, 一条数据1KB,B+ Tree 深度 = 3

每个节点可以存储的索引节点 16KB / (1KB + 8B + 6B) = 16

则可以存储的数据记录数=16 * 16 * 16 = 4096

2、分析磁盘IO次数

        因为非叶子节点也存储的data,磁盘IO次数不可控

B+ Tree

1、分析B+ Tree的数据表可以存储多大的数据量:

        一个节点对应一个数据页(Mysql磁盘页大小默认16KB), 假设主键是bigint类型占8字节,指针6字节, 一条数据1KB,B+ Tree 深度 = 3

一个非叶子节点可以存储的索引节点 16KB / (8+6) = 1170 个

一个叶子节点可以存储的data个数 16KB / (1KB + 8字节)  = 16 个

则可以存储的数据记录数=1170 * 1170 * 16 = 2190W

2、分析磁盘IO次数

        有的存储引擎根节点常驻内存, 对应深度=3的B+ Tree, 主键查询时IO次数=2, 非主键查询时IO次数=3

存储引擎的数据结构

存储引擎:用于存储数据,提供读写接口。

存储引擎作用的是数据表,而不是数据库。

MyISAM

MyISAM的索引文件和数据文件是分离的(非聚集)

MyISAM数据表对应的文件:

  • .frm  表的结构信息
  • .MYD数据信息
  • .MYI索引信息

InnoDB

InnoDB数据表对应的文件:

  • .frm  表的结构信息
  • .ibd数据信息

存储引擎比较

MyISAMInnoDB
叶子节点之间单向指针双向指针
叶子节点内容索引+指向data的指针(非聚集索引)

1.主键索引:索引+data(聚集索引)

2. 非主键索引:索引+指向data的指针(非聚集索引)

结合存储引擎的数据结构,回答几个索引问题:

1. 为什么建议InnoDB表必须有主键?

        mysql在存储数据时是按照主键来存储的(聚集索引),若没有创建主键,mysql会自己选择一列作为主键:

  • 选择一列没有重复数据的列
  • 如果这种列不存在,mysql创建一个隐藏列作为主键列

        所以我们可以帮msyql做的事情就自己做了,而不是交给mysql去做。

2. 为什么建议InnoDB表主键建议是整型?

  • 整型和字符串相比, 更容易比较大小
  • 整型占用空间大小更小,存储时节省固态硬盘

3. 为什么建议InnoDB表主键建议是自增?

        B+树种不断增加元素,如果一个节点的元素数量超过限制,要么新增一个节点,要么一个节点分裂。如果是自增, 会导致B+树新增一个节点而不是节点分裂,从B+树的构建过程来看,新增一个节点肯定比节点分裂效率更高。

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

  • 数据一致性
  • 节省存储空间

联合索引

索引最左前缀原理

http://www.lqws.cn/news/565057.html

相关文章:

  • NeRF-Lidar实景重建:大疆Mavic 4 Pro低成本建模方案(2025实战指南)
  • 当SAM遇到声纳图像时之论文阅读
  • 【blender】使用bpy对一个obj的不同mesh进行不同的材质贴图(涉及对bmesh的操作)
  • 一键高效率图片MD5修改工具PHP版
  • 量子算法入门——5.Qiskit库介绍与简单应用(1)
  • 《伴时匣》app开发技术分享--用户登录(3)
  • MYSQL与PostgreSQL的差异
  • 解锁云原生微服务架构:搭建与部署实战全攻略
  • mac触摸板设置右键
  • 四大WordPress模板资源网站
  • docker启动xxl-job 网络问题
  • 【Linux手册】进程等待:必要性剖析与wait、waitpid等多种方式实操指南
  • IDE/IoT/实践小熊派LiteOS工程配置、编译、烧录、调试(基于 bearpi-iot_std_liteos 源码)
  • 软件测试 selenium
  • 【innovus基础】- 如何手动画线?
  • 【技术追踪】CLAIM:临床导向的 LGE 增强技术用于实现真实且多样化的心肌瘢痕合成与分割
  • 基于云的平板挠度模拟:动画与建模-AI云计算数值分析和代码验证
  • 青少年编程与数学 02-022 专业应用软件简介 01 设计与创意类软件:Adobe Creative Cloud
  • Wpf布局之UniformGrid面板!
  • MCP 中间件机制正式发布:FastMCP 的「责任链」进化
  • rollupOptions 详细讲解,如何优化性能
  • ali PaddleNLP docker
  • MATLAB GUI界面设计 第七章——高级应用
  • 机器学习8——神经网络下
  • 手机流量监控App(GlassWire)使用指南
  • WPF两种绑定方式的分析
  • ACE之ACE_Dev_Poll_Reactor
  • 高性能 List 转 Map 解决方案(10,000 元素)
  • 阿里云-接入SLS日志
  • HarmonyOS NEXT仓颉开发语言实战案例:健身App