什么是索引_
2026/7/23大约 2 分钟
简单来说,索引(Index) 就是数据库中的“目录”。
它是数据库管理系统(DBMS)中一个排序的数据结构,通过它,数据库可以像查字典一样,不需要扫描全表就能快速找到你需要的数据。
核心原理:为什么要索引?
想象一本书有 500 页,如果你想找“异步编程”在哪一页:
- 没有索引(全表扫描):你必须从第 1 页翻到第 500 页。
- 有索引(使用目录):你先翻到书后的索引表,找到“异步编程”,看到它在第 213 页,直接翻过去。
在 MySQL 中,如果不加索引,查询数据的时间复杂度是 O(n);有了索引(通常是 B+ 树结构),时间复杂度可以降低到 O(\log n)。
索引的分类
索引根据不同的维度有多种叫法:
逻辑功能角度
- 主键索引 (Primary Key):唯一且不为空。
- 唯一索引 (Unique Index):字段值必须唯一,但允许为空。
- 普通索引 (Normal Index):最基本的索引,没有任何限制。
- 全文索引 (Full-text Index):用于在大文本里搜索关键词。
字段个数角度
- 单列索引:只针对一个字段建索引。
- 联合索引 (Composite Index):多个字段组合成一个索引。注意: 必须符合“最左前缀法则”才能生效。
索引的优缺点
索引虽好,但不能乱加:
| 优点 | 缺点 |
|---|---|
| 查询速度极快,减少磁盘 I/O。 | 占用物理空间。索引本身也是要存磁盘的。 |
提高分组 (GROUP BY<br>) 和排序 (ORDER BY<br>) 的效率。 |
降低写操作性能。每次 INSERT<br>, UPDATE<br>, DELETE<br>时,数据库都要同步维护索引树。 |
什么场景适合加索引?
- 经常作为查询条件的字段(
WHERE后的字段)。 - 经常需要排序、分组的字段。
- 用于多表连接 (JOIN) 的关联字段(外键)。
- 区分度高的字段(比如手机号、用户 ID。性别这种区分度低的字段加索引意义不大)。
为什么索引会失效?(面试重点)
即便加了索引,某些骚操作也会让它失效:
- 左模糊查询:
LIKE '%abc'。 - 对索引列做运算或函数:
WHERE YEAR(create_time) = 2026。 - 类型转换:字段是字符串,查询时没加引号
WHERE phone = 138000。 - 联合索引不满足最左匹配。
