01-MySQL优化-底层数据结构和算法 📅 2026/7/13 13:15:58 本人理解如若有误欢迎指出。索引索引是帮助MySQL高效获取数据的排好序的数据结构。对于平时SQL语句的优化我这从索引开始别的影响查询效率的比如字段大小合理的字段类型等这里不做讨论。索引数据结构提示这个网址可以在线演示索引的插入情况https://www.cs.usfca.edu/~galles/visualization/Algorithms.html基于此作比较理解如图查找数据从右边的索引结构查询到数据地址然后根据地址去磁盘加载数据。二叉树从图中可以看到二叉树的机构数的叶子节点左边的小于右边如果我们插入的数据是递增的那么这棵树就会一直往右增加整棵树的高度就会不断的升高红黑树从图中可以看到红黑树保持了和二叉树的特点叶子节点左边小于右边但是它多了一个平衡从而让数的高度不至于升高。提示比较二叉树和红黑树查找节点5的数据我们发现二叉树需要查询5次红黑树3次查询速度就快了很多Hash表很多时候 Hash 索引要比 B 树索引更高效;仅能满足“”“IN”不支持范围查询;hash冲突问题;从图看出只需要hash一次就可以快速定位数据的位置。但是存在hash冲突导致hash链长。但是总体上说hash结构的索引查询效率还是很高的。B-Tree叶节点具有相同的深度叶节点的指针为空;所有索引元素不重复;节点中的数据索引从左到右递增排列;提示对比二叉树B-Tree也是一种特殊的二叉树。数据存储在索引上同时由于相同高度存放的索引元素更多查询效率更高BTree(B-Tree变种)非叶子节点不存储 data 只存储索引 ( 冗余 ) 可以放更多的索引 ;叶子节点包含所有索引字段;叶子节点存在指针指向MySQL查询规则基础MySQL 查询原理基本解释基于 InnoDB B 树,MySQLInnoDB 引擎的查询之所以高效核心在于其底层采用了 B 树索引 结构并结合了 16KB 的页Page 作为数据与磁盘交互的基本单位。假设我们一行数据大小为1K那么一页就能存16条数据也就是一个叶子节点能存16条数据再看非叶子节点假设主键ID为bigint类型那么长度为8B指针大小在Innodb源码中为6B一共就是14B那么一页里就可以存储16K/141170个(主键指针),那么一颗高度为2的B树能存储的数据为1170x1618720条一颗高度为3的B树能存储的数据为1170x1170x1621902400千万级条在千万级数据量的表中查询任意一条数据最多只需要经过 3 次磁盘 I/O即访问 3 个页。而在现代 SSD 或机械硬盘上3 次 I/O 的耗时通常在毫秒甚至微秒级别。这就是 MySQL 能够在海量数据中实现极速查询的根本原理。MySQL索引MySQL使用的是BTree索引。使用BTree索引的好处就是可以存储更多的索引 让树的高度下降通时叶子节点存在指针指向让查询效率更快。我们知道MySQL最常用的存储引擎就是Innodb和MyISAM他们存数数据的时候底层是怎么存储的呢MyISAM引擎MyISAM索引文件和数据文件是分离的(非聚集)从图中可以看出使用的BTree的索引存储方式叶子节点存放的是主键索引查找数据的时候根据找到的主键在回表一次查询得到最终的数据Innodb引擎遍历主键索引的叶子节点最后就是得到我们需要的数据所以Innodb的主键索引是聚集索引。 聚集索引叶节点包含了完整的数据记录联合索引联合索引是一个使用多个字段联合的索引底层数据存储结构是联合主键索引叶子节点包含了所有的表数据。了解了这些索引的数据结构后可以回答如下问题为什么建议 InnoDB 表必须建主键并且推荐使用整型的自增主键因为索引是有序的一种数据结构使用整形递增这要在维护索引的时候就更好维护我们在创建表的时候即使不创建主键MySQL也会给我们生成主键只是我们看不到是隐藏的在创建表时候我们自己定义主键比MySQL自己维护主键效率会更高。为什么非主键索引结构叶子节点存储的是主键值保持数据一致性和节省存储空间,回表查询