📄 MySQL 🟢 入门 ⏱ 9 分钟

📑 MySQL 索引是什么?为什么快?有哪些类型

索引就像书的目录,以空间换时间。B+ 树、主键/唯一/普通索引、聚簇/二级索引,一次理清。

1

索引是什么:像书的目录

📖 目录 vs 逐页翻书

没有索引 = 全表扫描,像逐页翻书找内容,数据量大时性能急剧下降。

有索引 = 像书前面的目录,先查目录定位到页,再翻过去——快得多。

⚖️ 核心思想:以空间换时间

索引是额外的数据结构,存储排序后的键值 + 指向行数据的指针。

它帮 WHERE / JOIN / ORDER BY 快速定位,但要占额外磁盘空间,且每次增删改都要维护索引 → 写入变慢。

所以索引不是建得越多越好。

📚

无索引

全表扫描
逐行检查
数据大时极慢

VS
📑

有索引

先查目录定位
O(log n) 定位
大幅减少磁盘 I/O

索引 = 以空间换时间,加速查询
2

为什么 B+ 树快

🌳 B+ 树:InnoDB 默认索引

InnoDB 默认用 B+ 树索引。所有数据按顺序存在叶子节点,叶子节点用双向链表连起来。

支持等值查询和范围查询、排序——适合 ORDER BY、GROUP BY、范围比较。

⚡ 为什么不用二叉树/红黑树

数据库要减少磁盘 I/O(读磁盘慢)。二叉树太高,每次查找都要多次读盘。

B+ 树矮胖(一个节点存多个键),几层就能覆盖海量数据,磁盘 I/O 次数少。

叶子节点有序 + 链表,也天然适合范围查询。

⚡ 哈希索引

Memory 引擎默认支持,基于哈希表。

只支持等值查询(= 和 IN),不支持范围查询和排序。

查询速度极快但无顺序性,适用精确匹配场景。

🎬 范围查询:B+ 树 vs 哈希
B+ 树
WHERE age BETWEEN 20 AND 30 → 从叶子链表顺序扫,一次搞定 ✅
哈希
WHERE age BETWEEN 20 AND 30 → 哈希只能等值,范围查询无能为力 ❌
3

索引类型(三个维度)

🔢 按数据结构

• B+ 树索引:InnoDB 默认,等值+范围
• 哈希索引:Memory 默认,仅等值

🎯 按功能逻辑

• 主键索引:特殊的唯一索引,不允许 NULL,InnoDB 里数据即索引
• 唯一索引:列值唯一,允许一个 NULL
• 普通索引:无约束,仅加速查询
• 全文索引:文本分词搜索 MATCH...AGAINST
• 空间索引:地理空间数据

🗂️ 按存储方式

• 聚簇索引:InnoDB 主键,数据存在索引叶子节点,表即索引
• 二级索引:叶子存主键值,查询需回表(下篇细讲)

分类维度类型关键点
数据结构B+ 树 / 哈希B+树支持范围排序,哈希仅等值
功能逻辑主键/唯一/普通/全文/空间主键不允许NULL,唯一允许一个NULL
存储方式聚簇 / 二级聚簇存数据,二级存主键值需回表
4

面试怎么答

🔑
别只说「加快查询」

要主动关联 B+ 树、聚簇索引、二级索引,展示知识体系深度。

🌳
为什么 B+ 树

矮胖、磁盘 I/O 少、叶子有序支持范围查询——这是核心。

🧠
谁决定用不用索引

MySQL 优化器通过成本模型判断,不是开发者强制指定。

⚖️
索引不是越多越好

要权衡查询速度和写入成本,按实际查询模式设计。

一句话总结

索引是加速查询的数据结构,像书的目录,核心是「以空间换时间」。InnoDB 默认 B+ 树,矮胖、磁盘 I/O 少、叶子有序支持范围查询;哈希索引仅支持等值。索引按数据结构(B+/哈希)、功能逻辑(主键/唯一/普通/全文/空间)、存储方式(聚簇/二级)三类分。代价是占空间 + 写入变慢,不是越多越好。

🎤 面试问答 · 口语化回答
「什么是索引」是 MySQL 面试的入门题,考官想听结构实现而不只是概念:
面试官什么是索引?为什么能加快查询?
你

索引是数据库用来加速查询的数据结构,就像书的目录——有索引先查目录定位到页,没有索引就只能逐页翻书也就是全表扫描。核心思想是以空间换时间,用额外的数据结构存排序后的键值和指向行的指针。MySQL InnoDB 默认用 B+ 树实现,能以 O(log n) 复杂度定位数据,大幅减少磁盘 I/O。

💡 加分点:主动补一句「以空间换时间 + B+ 树实现」,比只说加快查询专业得多。
面试官MySQL 索引有哪些类型?
你

我按三个维度分。按数据结构分:B+ 树索引和哈希索引,B+ 树支持范围查询排序,哈希只支持等值。按功能逻辑分:主键索引、唯一索引、普通索引、全文索引、空间索引,主键索引是特殊的唯一索引且不允许空值。按存储方式分:聚簇索引和二级索引,聚簇索引数据就存在索引叶子节点上,二级索引叶子存主键值查询要回表。

💡 加分点:从三个维度系统化回答,显得知识结构完整,比零散列举加分。
面试官为什么用 B+ 树而不用二叉树?
你

核心是减少磁盘 I/O。数据库数据在磁盘上,读磁盘很慢。二叉树太高了,每次查找要多次读盘;B+ 树是矮胖结构,一个节点能存很多键,几层就能覆盖海量数据,查找时磁盘 I/O 次数少。另外 B+ 树的叶子节点有序且用链表连接,天然支持范围查询和排序,这个对数据库很重要。

💡 加分点:能说出「矮胖结构 + 磁盘 I/O 少 + 叶子有序支持范围查询」三个点,说明你真理解了而不是背结论。
📝 读完打卡 · 写下你的收获 读完了?来打卡吧
用一句话写下你从这篇学到的最大收获,检验自己是否真的懂了 👇
⏱ 00:00 🔥0分