Jw
首页
技术
英语
首页
技术
英语
  • MySQL

    • MySQL 基础
    • 环境变量配置(PATH)
    • SQL 语法与分类
    • MySQL 数据类型
    • SQL - DDL 数据定义语言
    • SQL - DML 数据操作语言
    • SQL - DQL 数据查询语言
    • SQL - DCL 数据控制语言
    • MySQL 函数
    • SQL 约束
    • SQL 外键约束
    • 多表关系
    • 多表查询(连接查询)
    • 隐式内连接 vs 显式内连接
    • 子查询
    • 多表查询案例
    • 事务
    • 并发事务问题与隔离级别
    • MySQL 体系结构与存储引擎
    • 索引概述
    • 索引结构
    • 索引分类
    • 索引语法
    • SQL 性能分析
    • 索引使用
    • 索引设计原则
    • SQL 优化 - 插入数据与主键优化
    • SQL 优化 - order by 与 group by
    • SQL 优化 - limit / count / update
    • 视图
    • 存储过程
    • 存储过程 - 变量
    • 存储过程 - 流程控制、游标与条件处理
    • 存储函数
    • 触发器
    • 锁概述与全局锁
    • 表级锁
    • 行级锁
    • InnoDB 逻辑存储结构
    • InnoDB 架构
    • 事务原理(redo / undo log)
    • MVCC
    • MySQL 系统数据库
    • MySQL 常用工具
    • 数据备份与导入导出
    • 错误日志与二进制日志
    • 查询日志与慢查询日志
    • 主从复制 - 概述与原理
    • 主从复制 - 搭建
    • Mycat 配置
    • Mycat 垂直拆分与水平拆分
    • Mycat 分片规则
    • Mycat 管理与监控
    • Mycat 读写分离 - 一主一从
    • Mycat 读写分离 - 双主双从

索引结构

MySQL 的索引是在存储引擎层实现的,不同的存储引擎有不同的结构。

一、索引结构分类

索引结构描述
B+Tree 索引最常见的索引类型,大部分引擎都支持 B+ 树索引
Hash 索引底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
R-tree(空间索引)空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引)是一种通过建立倒排索引快速匹配文档的方式,类似于 Lucene、Solr、ES

各存储引擎的支持情况

索引InnoDBMyISAMMemory
B+tree 索引支持支持支持
Hash 索引不支持不支持支持
R-tree 索引不支持支持不支持
Full-text5.6 版本之后支持支持不支持

我们平常所说的索引,如果没有特别指明,都是指 B+ 树结构组织的索引。

二、树结构的演进

结构问题 / 特点
二叉树顺序插入时会形成一个链表,查询性能大大降低;大数据量情况下层级较深,检索速度慢
红黑树大数据量情况下层级较深,检索速度慢
B-Tree(多路平衡查找树)以最大度数(max-degree)为 5(5 阶)为例:每个节点最多存储 4 个 key、5 个指针;叶子与非叶子节点都存数据
B+Tree① 所有的数据都会出现在叶子节点;② 叶子节点形成一个单向链表(非叶子节点只做索引)

MySQL 对 B+Tree 的优化:在经典 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,形成带有顺序指针的 B+Tree,提高区间访问的性能。

三、Hash 索引

特点

  1. Hash 索引只能用于对等比较(=、in),不支持范围查询(between、>、< …);
  2. 无法利用索引完成排序操作;
  3. 查询效率高,通常只需要一次检索,效率通常要高于 B+tree 索引。

原理:采用一定的 hash 算法将键值换算成新的 hash 值,映射到对应的槽位上,然后存储在 hash 表中。如果两个(或多个)键值映射到同一个槽位上,就产生了 hash 冲突(hash 碰撞),可以通过链表来解决。

存储引擎支持:MySQL 中支持 hash 索引的是 Memory 引擎;InnoDB 具有自适应 hash 功能,hash 索引是存储引擎根据 B+Tree 索引在指定条件下自动构建的。

四、为什么 InnoDB 选择 B+Tree

  • 相对于二叉树,层级更少,搜索效率高;
  • 相对于 B-Tree:无论叶子节点还是非叶子节点都会保存数据,导致一页中存储的键值减少,指针也跟着减少,要同样保存大量数据只能增加树的高度,导致性能降低;
  • 相对于 Hash 索引:B+Tree 支持范围匹配及排序操作。

InnoDB 主键索引的 B+Tree 高度

假设:一行数据大小为 1K,一页中可以存储 16 行数据;指针占 6 个字节,主键为 bigint 占 8 字节。

树高估算
高度为 2n*8 + (n+1)*6 = 16*1024 → n ≈ 1170,约 1171 * 16 ≈ 18736 行
高度为 31171 * 1171 * 16 ≈ 21939856 行(约 2000 万)

相关

  • 索引概述:索引的作用与优缺点
  • 索引分类:聚集索引 / 二级索引与回表
  • MySQL 体系结构与存储引擎:存储引擎与索引的关系
最近更新: 2026/10/9 23:41
Contributors: liujw
Prev
索引概述
Next
索引分类