首页/数据/数据库速查/CREATE INDEX 索引创建与使用策略
SQL 语法52 条

CREATE INDEX 索引创建与使用策略

为查询条件、排序与连接列建索引:复合索引遵循最左前缀,覆盖索引可免除回表,但索引不是越多越好。

数据库速查数据更新于 2026-10-13

加索引是什么

索引为查询条件、排序与连接列服务:建得好能把全表扫描变成精确定位,建得多则拖慢写入并干扰优化器选择。核心规则有三条——复合索引遵循最左前缀,能覆盖查询所需列的索引可以免去回表,索引不是越多越好。加索引前先确认要服务哪条具体语句,而不是按字段逐个建。

基本信息

用途为查询条件、排序与连接加速
语法创建索引 索引名 于 表 (列[, ...])
索引种类普通索引、唯一索引、全文索引、前缀索引
核心原则最左前缀、高选择性、控制数量
覆盖索引查询涉及的列都在索引里时可免回表
写入代价每个索引都会在写入时同步维护

典型使用场景

  • 高频查询条件列没有索引,计划里出现全表扫描
  • 过滤条件加排序组合,建复合索引消除额外排序
  • 保证业务唯一性:用唯一索引做约束
  • 长字符串字段用前缀索引控制索引体积
  • 清理冗余索引:删除与已有复合索引前缀重复的索引

创建示例

创建示例
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,并可能锁住元数据;安排在低峰期执行,并提前评估所需时间与磁盘空间。

易错点

  • 为低选择性列单独建索引:优化器多数时候不会使用,只增加写入与存储成本
  • 复合索引列顺序写反:最左前缀用不上,索引形同虚设
  • 长字符串建完整索引:索引体积膨胀、写入与缓存效率下降,应改用前缀索引并验证区分度
  • 索引只加不减:冗余索引不断累积,写入变慢且优化器的选择空间被干扰

数据来源与参考

  • MySQL 8.0 Reference Manual: CREATE INDEX Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌