在mysql数据库中,索引是提升查询性能的重要手段。对于innodb存储引擎来说,索引一般使用b+树这种数据结构来实现。无论是主键索引还是二级索引,底层大多以b+树的形式组织数据。

为什么mysql选择b+树
常见的数据结构有二叉树、红黑树、哈希表、b树和b+树。mysql没有使用普通的二叉树或红黑树,主要是因为这类树在数据量大时高度过高,而每一次树的节点访问往往对应一次磁盘io,树越高磁盘io越多,查询就越慢。
b+树的核心特点
- 非叶子节点只存储键值和指向子节点的指针,不保存实际数据,因此单个节点能容纳更多键值,树的高度更低。
- 所有实际数据都存放在叶子节点中,并且叶子节点之间采用双向链表连接。
- 进行范围查询时,只需要找到起始叶子节点,然后顺着链表遍历即可,不需要回到上层节点。
与其他结构的简单对比
| 数据结构 | 主要问题 | 是否适合mysql磁盘索引 |
|---|---|---|
| 二叉树 | 容易退化为链表,高度不可控 | 不适合 |
| 红黑树 | 高度仍较大,磁盘io偏多 | 不适合 |
| 哈希表 | 不支持范围查询和排序 | 仅适合等值查询场景 |
| b+树 | 实现稍复杂 | 非常适合 |
一个简单的b+树索引查询示例
下面用伪代码展示通过b+树索引查找某个主键的过程:
// 根据主键id在b+树索引中查找用户记录
public User findUserById(BPlusTree tree, long id) {
// 从根节点开始向下搜索
BPlusNode node = tree.root;
while (!node.isLeaf) {
// 根据键值选择子节点
node = node.getChild(id);
}
// 在叶子节点中查找具体数据
return node.getData(id);
}
小结
mysql索引一般使用b+树作为底层数据结构,这是由磁盘io特性和查询需求决定的。理解<code>b+树</code>的组织方式,能帮助我们更好地建立索引、避免索引失效,并写出更高效的sql语句。
mysql索引B_plus_tree数据结构修改时间:2026-07-29 15:51:23