MySQL 查询快核心原因之一是索引。索引不是简单的目录而是一种有序的数据结构。对于 InnoDB 来说最重要的索引结构就是 B 树。理解 B 树之前先把 MySQL 的整体结构和存储引擎说清楚SQL 不是直接落到磁盘文件上的中间会经过连接层、服务层、引擎层和存储层。MySQL 的四层结构层级作用连接层管理客户端连接、认证、权限校验服务层SQL 解析、优化、执行、内置函数等引擎层负责数据存取的具体实现比如 InnoDB存储层真正的磁盘文件和数据页存储引擎是基于表的同一个库里的不同表可以使用不同引擎。日常最常见的是 InnoDB。常见存储引擎对比引擎事务锁粒度外键典型特点InnoDB支持表锁、行锁支持默认引擎兼顾可靠性和性能MyISAM不支持表锁不支持早期常见现在使用较少Memory不支持表锁不支持数据主要在内存中重启易丢失InnoDB 的几个关键词很重要事务、行级锁、外键、B 树索引、Buffer Pool、redo log、undo log。其中索引结构决定了查询路径日志机制决定了事务可靠性。索引到底是什么索引是帮助 MySQL 高效获取数据的有序数据结构。没有索引时数据库可能要从头到尾扫描整张表有索引时可以沿着索引结构快速缩小查找范围。索引的收益主要有两个提高数据检索效率降低磁盘 IO。借助有序结构降低排序成本。但索引不是免费的。每次写入、更新、删除数据时索引结构也需要维护所以索引越多写入成本越高。为什么不用普通二叉树二叉搜索树在理想情况下查询效率不错但它有一个大问题如果数据插入顺序接近有序树可能退化成链表。1 \ 2 \ 3 \ 4这种情况下查询复杂度接近全表扫描。红黑树通过旋转和变色保持平衡可以避免严重退化但它仍然不适合作为数据库磁盘索引的主结构。原因是红黑树每个节点存储的数据太少树高相对较高。数据库查询通常涉及磁盘 IO树越高磁盘访问次数越多。B 树解决了什么B 树是一种多路平衡查找树。一个节点可以存多个 key也可以有多个子节点。相比二叉树它可以显著降低树高。如果一个节点能容纳更多 key一次磁盘 IO 就能加载更多索引信息下一步查找范围也能缩得更小。为什么 InnoDB 更适合 B 树B 树是在 B 树基础上的优化更适合外存索引。它和 B 树有几个关键区别对比项B 树B 树数据存放非叶子节点和叶子节点都可能存数据数据集中在叶子节点非叶子节点存 key 和数据主要存 key 和指针范围查询需要中序遍历叶子节点链表天然适合范围扫描查询稳定性命中位置不同路径可能不同通常都走到叶子节点路径更稳定B 树有三个适合数据库的优势磁盘 IO 成本更低非叶子节点不存整行数据可以放更多 key树更矮。查询效率更稳定数据集中在叶子节点查找路径更一致。范围查询更方便叶子节点之间有链表区间扫描非常自然。InnoDB 中的数据页InnoDB 管理磁盘的基本单位是页默认大小是 16KB。B 树的节点可以理解为一个个数据页查询时从根节点开始逐层定位到叶子节点。一次普通等值查询可以按这条路径理解否是聚簇索引二级索引SQL 条件进入优化器选择可用索引读取 B 树根节点根据 key 定位下一层页是否到达叶子节点是聚簇索引还是二级索引叶子节点直接拿到整行数据叶子节点拿到主键值必要时回到主键索引取整行一次等值查询大致是从根页开始比较 key。找到下一层页指针。继续向下定位。到叶子节点找到目标记录或主键值。对于高度较低的 B 树即使数据量很大也只需要少量磁盘 IO 就能定位记录。范围查询时B 树的叶子链表会继续发挥作用定位范围起点叶子节点 1叶子节点 2叶子节点 3直到超过范围终点面试回答模板可以这样回答MySQL 的 InnoDB 默认使用 B 树实现索引。相比二叉树和红黑树B 树是多路查找树树高更低更适合磁盘 IO。相比 B 树B 树把数据集中放在叶子节点非叶子节点能存更多 key因此路径更短同时叶子节点之间通过链表连接范围查询和排序扫描效率更高。所以 InnoDB 选择 B 树是为了降低磁盘读写成本、提升查询稳定性并更好支持范围查询。小结索引不是抽象概念它背后就是数据结构和磁盘 IO 的取舍。InnoDB 使用 B 树是因为它能用更矮的树、更稳定的查询路径和更友好的范围扫描能力支撑大数据量下的高效查询。