加索引是什么
索引为查询条件、排序与连接列服务:建得好能把全表扫描变成精确定位,建得多则拖慢写入并干扰优化器选择。核心规则有三条——复合索引遵循最左前缀,能覆盖查询所需列的索引可以免去回表,索引不是越多越好。加索引前先确认要服务哪条具体语句,而不是按字段逐个建。
基本信息
| 用途 | 为查询条件、排序与连接加速 |
|---|---|
| 语法 | 创建索引 索引名 于 表 (列[, ...]) |
| 索引种类 | 普通索引、唯一索引、全文索引、前缀索引 |
| 核心原则 | 最左前缀、高选择性、控制数量 |
| 覆盖索引 | 查询涉及的列都在索引里时可免回表 |
| 写入代价 | 每个索引都会在写入时同步维护 |
典型使用场景
- 高频查询条件列没有索引,计划里出现全表扫描
- 过滤条件加排序组合,建复合索引消除额外排序
- 保证业务唯一性:用唯一索引做约束
- 长字符串字段用前缀索引控制索引体积
- 清理冗余索引:删除与已有复合索引前缀重复的索引
创建示例
创建示例
CREATE INDEX idx_user_created ON orders (user_id, created_at); # 过滤加排序的复合索引
CREATE UNIQUE INDEX uk_email ON users (email); # 唯一约束兼查询加速
CREATE INDEX idx_sku_prefix ON orders (sku(16)); # 长字符串用前缀索引控制空间查看与删除
查看与删除
SHOW INDEX FROM orders; # 查看现有索引清单与列顺序
DROP INDEX idx_sku_prefix ON orders; # 删除不再使用的索引索引类型对照
| 类型 | 作用 | 注意 |
|---|---|---|
| 普通索引 | 加速查询 | 最常用,不保证唯一 |
| 唯一索引 | 约束唯一性并加速查找 | 插入冲突会直接报错 |
| 复合索引 | 多列组合 | 遵循最左前缀,列顺序很关键 |
| 前缀索引 | 只索引字符串前若干字符 | 需确认区分度足够 |
| 全文索引 | 文本检索 | 与常规等值查询用途不同 |
| 覆盖索引 | 查询列都在索引中 | 免回表,收益最大 |
二级索引会隐含包含主键列,主键越长,每个二级索引占用也越大;选择紧凑主键能连带降低整体索引体积。
写多读少的表要控制索引数量:每个索引都会在写入时同步维护,索引过多会让插入与更新明显变慢。
给低选择性的列单独建索引几乎没有收益(例如状态枚举、性别):优化器往往会放弃使用,白占空间还拖慢写入。
索引检查清单
- 索引要对应具体语句,不是按字段逐个建
- 复合索引的列顺序按过滤性与排序需求排列
- 确认前缀索引的区分度足够
- 定期清理冗余索引与被完全覆盖的索引
- 加索引后回归验证,防止影响其他语句
加索引本身也是写操作:大表上建索引会占用 IO 与 CPU,并可能锁住元数据;安排在低峰期执行,并提前评估所需时间与磁盘空间。