SQL-索引

🚀 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)建索引

四、索引优化核心原则

  1. 离散度优先
    索引列值越唯一(如 UUID),索引效率越高

  2. 覆盖查询
    尽量让查询字段被索引覆盖(减少回表查询)

    -- 示例:索引包含name和score,可直接返回结果
    SELECT name, score FROM students WHERE score > 80;
    
  3. 避免过度索引
    单表索引建议不超过 5 个,每个索引字段不超过 3 个

五、总结:索引的正确打开方式

  • 必建场景:主键、外键、高频查询条件列

  • 避坑指南:低离散度列、频繁更新列慎建索引

  • 透明特性:应用层无需感知索引存在,数据库自动优化查询计划

一句话总结:索引是查询性能的加速器,但需在查询速度与写入成本间找到平衡!