⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

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
高区分度列值种类多的列(如手机号)区分度高效果好

索引的优缺点

  1. 优点:极大加速 SELECT 查询和 WHERE 过滤,提升排序和分组效率
  2. 缺点:占用额外磁盘空间,INSERT/UPDATE/DELETE 操作会变慢(需同步更新索引)
  3. 建议:在查询频繁但更新较少的列上建索引,避免在低区分度列(如性别)上建索引

查看索引使用情况

-- MySQL 查看表的索引
SHOW INDEX FROM students;

-- 使用 EXPLAIN 分析查询是否走索引 EXPLAIN SELECT * FROM students WHERE score > 80;

实战任务

  1. 在 students 表的 score 列上创建降序索引
  2. 使用 EXPLAIN 对比创建索引前后的查询计划
  3. 在 name 列上创建唯一索引,观察重复插入时的报错
Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 146 篇
0 完成
🔥 0