🚀 SQL-索引
一、索引是什么?为什么需要它?
索引是关系数据库中对列值进行预排序的数据结构,作用类似书籍的目录:
- 核心价值:避免全表扫描,直接定位符合条件的记录,大幅提升查询速度
- 适用场景:数据量较大(万级 / 亿级)、高频查询的列(如订单表的
create_time
) - 反例:低离散度列(如
gender
,仅 M/F 两种值)创建索引无意义
二、如何创建索引?看这 3 种语法!
1. 普通索引(最常用)
-- 单字段索引
ALTER TABLE students ADD INDEX idx_score (score);
-- 多字段联合索引(左匹配原则)
ALTER TABLE students ADD INDEX idx_name_score (name, score);
关键点:
- 索引名可自定义(如
idx_
前缀便于识别) - 联合索引按查询条件的顺序创建(先查
name
再查score
时效率最高)
2. 主键索引(自动创建)
数据库特性:
- 主键列会自动创建索引,且保证唯一性
- 效率最高(主键查询相当于 “目录精准定位”)
-- 创建表时指定主键
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
3. 唯一索引(业务唯一性约束)
适用场景:
- 身份证号、邮箱等 “逻辑唯一” 字段(不宜作为主键,但需唯一约束)
-- 方式1:创建唯一索引(附带索引优化)
ALTER TABLE students ADD UNIQUE INDEX uni_email (email);
-- 方式2:仅添加唯一性约束(无索引)
ALTER TABLE students ADD CONSTRAINT uni_email UNIQUE (email);
区别:
- 前者创建索引,查询时可加速;后者仅保证唯一性,无性能优化
三、索引的双刃剑:优点与代价
优点 | 代价 |
---|---|
✅ 查询速度飙升(尤其范围查询、排序) | ❌ 插入 / 更新 / 删除变慢(需同步更新索引) |
✅ 支持高效分组(GROUP BY)和连接(JOIN) | ❌ 占用额外存储空间(索引文件) |
最佳实践:
- 高频查询列优先建索引
- 低频写操作表可适当多建索引
- 避免对大文本字段(TEXT)建索引
四、索引优化核心原则
-
离散度优先:
索引列值越唯一(如 UUID),索引效率越高 -
覆盖查询:
尽量让查询字段被索引覆盖(减少回表查询)-- 示例:索引包含name和score,可直接返回结果 SELECT name, score FROM students WHERE score > 80;
-
避免过度索引:
单表索引建议不超过 5 个,每个索引字段不超过 3 个
五、总结:索引的正确打开方式
-
必建场景:主键、外键、高频查询条件列
-
避坑指南:低离散度列、频繁更新列慎建索引
-
透明特性:应用层无需感知索引存在,数据库自动优化查询计划
一句话总结:索引是查询性能的加速器,但需在查询速度与写入成本间找到平衡!