
MySQL 的 InnoDB 使用B 树索引核心原因是数据库数据主要存储在磁盘中而 B 树能够用很少的磁盘 I/O 完成查询同时高效支持范围查询和排序。B 树的主要优点树高低磁盘 I/O 少InnoDB 默认以约16KB的页为单位读写数据。B 树一个非叶子节点可以存放大量索引键和子节点指针因此分叉很多树高通常只有 34 层查询一行数据只需要访问少量页面根节点 → 中间节点 → 叶子节点根节点和部分中间节点通常还会被缓存所以实际磁盘读取次数可能更少。非叶子节点不存完整数据B 树的非叶子节点主要保存索引键 子节点指针完整记录或记录定位信息放在叶子节点中。这样非叶子节点能容纳更多索引项使树的分叉数更大、整体高度更低。范围查询效率高叶子节点按照索引键有序排列并通过双向链表连接。例如SELECT * FROM users WHERE age BETWEEN 20 AND 30;数据库定位到age 20附近的叶子节点后可以沿着叶子节点连续扫描不需要为每一条记录重新从根节点查找。这也有利于ORDER BY GROUP BY MIN() MAX() 前缀匹配 LIKE abc%查询性能稳定B 树是一棵平衡多路搜索树所有叶子节点基本处于相同深度。无论查询哪个索引值访问路径长度都比较接近不容易出现普通二叉搜索树退化成链表的问题。适合数据库的页式存储B 树节点大小可以与数据库页相匹配。每次磁盘读取一个页面就可以得到大量索引信息充分利用磁盘顺序读取和局部性。为什么不用其他数据结构数据结构问题普通二叉树分叉少数据量大时树很高磁盘 I/O 多红黑树虽然平衡但每个节点通常只有两个子节点树高仍然较高Hash 索引适合等值查询但不适合范围查询、排序和最左前缀匹配B 树数据也存放在非叶子节点中导致单个节点能保存的索引键更少分叉数较小B 树分叉多、树高低同时适合等值查询和范围查询InnoDB 中的具体存储方式聚簇索引主键索引叶子节点保存完整行数据。二级索引叶子节点保存索引列和对应的主键值。因此通过二级索引查询其他列时可能需要先找到主键再通过主键索引读取完整记录这个过程叫作回表。一句话总结InnoDB 使用 B 树是因为它通过高分叉、低树高减少磁盘 I/O并且能够高效支持等值查询、范围查询、排序和顺序扫描。