📑 MySQL 索引是什么?为什么快?有哪些类型
索引就像书的目录,以空间换时间。B+ 树、主键/唯一/普通索引、聚簇/二级索引,一次理清。
索引是什么:像书的目录
📖 目录 vs 逐页翻书
没有索引 = 全表扫描,像逐页翻书找内容,数据量大时性能急剧下降。
有索引 = 像书前面的目录,先查目录定位到页,再翻过去——快得多。
⚖️ 核心思想:以空间换时间
索引是额外的数据结构,存储排序后的键值 + 指向行数据的指针。
它帮 WHERE / JOIN / ORDER BY 快速定位,但要占额外磁盘空间,且每次增删改都要维护索引 → 写入变慢。
所以索引不是建得越多越好。
无索引
全表扫描
逐行检查
数据大时极慢
有索引
先查目录定位
O(log n) 定位
大幅减少磁盘 I/O
为什么 B+ 树快
🌳 B+ 树:InnoDB 默认索引
InnoDB 默认用 B+ 树索引。所有数据按顺序存在叶子节点,叶子节点用双向链表连起来。
支持等值查询和范围查询、排序——适合 ORDER BY、GROUP BY、范围比较。
⚡ 为什么不用二叉树/红黑树
数据库要减少磁盘 I/O(读磁盘慢)。二叉树太高,每次查找都要多次读盘。
B+ 树矮胖(一个节点存多个键),几层就能覆盖海量数据,磁盘 I/O 次数少。
叶子节点有序 + 链表,也天然适合范围查询。
⚡ 哈希索引
Memory 引擎默认支持,基于哈希表。
只支持等值查询(= 和 IN),不支持范围查询和排序。
查询速度极快但无顺序性,适用精确匹配场景。
索引类型(三个维度)
🔢 按数据结构
• B+ 树索引:InnoDB 默认,等值+范围
• 哈希索引:Memory 默认,仅等值
🎯 按功能逻辑
• 主键索引:特殊的唯一索引,不允许 NULL,InnoDB 里数据即索引
• 唯一索引:列值唯一,允许一个 NULL
• 普通索引:无约束,仅加速查询
• 全文索引:文本分词搜索 MATCH...AGAINST
• 空间索引:地理空间数据
🗂️ 按存储方式
• 聚簇索引:InnoDB 主键,数据存在索引叶子节点,表即索引
• 二级索引:叶子存主键值,查询需回表(下篇细讲)
| 分类维度 | 类型 | 关键点 |
|---|---|---|
| 数据结构 | B+ 树 / 哈希 | B+树支持范围排序,哈希仅等值 |
| 功能逻辑 | 主键/唯一/普通/全文/空间 | 主键不允许NULL,唯一允许一个NULL |
| 存储方式 | 聚簇 / 二级 | 聚簇存数据,二级存主键值需回表 |
面试怎么答
别只说「加快查询」
要主动关联 B+ 树、聚簇索引、二级索引,展示知识体系深度。
为什么 B+ 树
矮胖、磁盘 I/O 少、叶子有序支持范围查询——这是核心。
谁决定用不用索引
MySQL 优化器通过成本模型判断,不是开发者强制指定。
索引不是越多越好
要权衡查询速度和写入成本,按实际查询模式设计。
索引是加速查询的数据结构,像书的目录,核心是「以空间换时间」。InnoDB 默认 B+ 树,矮胖、磁盘 I/O 少、叶子有序支持范围查询;哈希索引仅支持等值。索引按数据结构(B+/哈希)、功能逻辑(主键/唯一/普通/全文/空间)、存储方式(聚簇/二级)三类分。代价是占空间 + 写入变慢,不是越多越好。
索引是数据库用来加速查询的数据结构,就像书的目录——有索引先查目录定位到页,没有索引就只能逐页翻书也就是全表扫描。核心思想是以空间换时间,用额外的数据结构存排序后的键值和指向行的指针。MySQL InnoDB 默认用 B+ 树实现,能以 O(log n) 复杂度定位数据,大幅减少磁盘 I/O。
我按三个维度分。按数据结构分:B+ 树索引和哈希索引,B+ 树支持范围查询排序,哈希只支持等值。按功能逻辑分:主键索引、唯一索引、普通索引、全文索引、空间索引,主键索引是特殊的唯一索引且不允许空值。按存储方式分:聚簇索引和二级索引,聚簇索引数据就存在索引叶子节点上,二级索引叶子存主键值查询要回表。
核心是减少磁盘 I/O。数据库数据在磁盘上,读磁盘很慢。二叉树太高了,每次查找要多次读盘;B+ 树是矮胖结构,一个节点能存很多键,几层就能覆盖海量数据,查找时磁盘 I/O 次数少。另外 B+ 树的叶子节点有序且用链表连接,天然支持范围查询和排序,这个对数据库很重要。