SQL 索引
学习创建索引加速查询 · 难度:高级 · +15XP
SQL 索引
索引(Index)是数据库中一种特殊的数据结构,类似于书籍的目录。当表中的数据量越来越大时,如果没有索引,数据库必须逐行扫描全表来查找目标数据,这称为全表扫描,效率极低。创建索引可以大幅提升查询速度,让数据库通过索引快速定位到目标行。
索引的工作原理
数据库索引通常使用 B-Tree(平衡树)或 Hash 结构存储。当你在某列上创建索引后,数据库会为该列维护一个有序的查找结构。执行查询时,数据库优先使用索引来定位数据,而不是逐行扫描整个表。
创建索引
最常用的索引类型是普通索引,语法如下:
-- 创建单列索引
CREATE INDEX idx_name ON 表名(列名);
-- 创建复合索引(多列)
CREATE INDEX idx_name ON 表名(列1, 列2);
-- 创建唯一索引(值不可重复)
CREATE UNIQUE INDEX idx_name ON 表名(列名);
-- 指定排序方式
CREATE INDEX idx_score ON students(score DESC);
删除索引
不再需要的索引应该及时删除,因为索引会占用额外的存储空间,并且在插入、更新、删除数据时会增加维护开销:
-- MySQL / SQL Server
DROP INDEX idx_name ON 表名;
-- PostgreSQL / Oracle
DROP INDEX idx_name;
-- SQLite
DROP INDEX idx_name;
哪些列适合建索引
| 场景 | 说明 | 示例 |
|---|---|---|
| WHERE 条件列 | 经常在 WHERE 中过滤的列 | WHERE score > 80 |
| ORDER BY 列 | 经常需要排序的列 | ORDER BY create_time |
| JOIN 关联列 | 表连接时用的外键列 | JOIN ON a.user_id = b.id |
| 高区分度列 | 值种类多的列(如手机号) | 区分度高效果好 |
索引的优缺点
- 优点:极大加速 SELECT 查询和 WHERE 过滤,提升排序和分组效率
- 缺点:占用额外磁盘空间,INSERT/UPDATE/DELETE 操作会变慢(需同步更新索引)
- 建议:在查询频繁但更新较少的列上建索引,避免在低区分度列(如性别)上建索引
查看索引使用情况
-- MySQL 查看表的索引
SHOW INDEX FROM students;
-- 使用 EXPLAIN 分析查询是否走索引
EXPLAIN SELECT * FROM students WHERE score > 80;
实战任务
- 在 students 表的 score 列上创建降序索引
- 使用 EXPLAIN 对比创建索引前后的查询计划
- 在 name 列上创建唯一索引,观察重复插入时的报错