首页/数据/SQL 速查/USE / IGNORE / FORCE INDEX 表提示
性能与执行计划72 条

USE / IGNORE / FORCE INDEX 表提示

在表名后声明索引提示:强制、忽略或限定候选索引,用来复现计划或临时规避优化器误判。

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

表级索引提示

索引提示写在表名之后,用来强制、限定或忽略候选索引:USE INDEX 缩小候选范围,FORCE INDEX 更强,IGNORE INDEX 把某个索引排除在外。它适合复现计划和临时规避优化器误判,MySQL 支持;PostgreSQL 没有原生的表级提示机制。

基本信息

语法表名后跟 USE INDEX / FORCE INDEX / IGNORE INDEX (索引列表)
USE把候选缩到给定索引,但仍可能选择更便宜的选项或全表扫描
FORCE比 USE 更强:优先使用给定索引,确实用不了才退让
作用域只影响当前语句,UPDATE 与 DELETE 同样可用
PostgreSQL没有原生表提示,需从统计信息或扩展层面处理

典型使用场景

  • 复现线上计划做对比实验
  • 临时规避优化器选错索引造成的慢查询
  • 验证某个索引确实能加速目标语句
  • 梳理冗余索引时做对照实验
  • 上线前用提示验证候选索引的效果

示例

示例
-- 限定候选索引
SELECT * FROM orders USE INDEX (idx_user_status)
WHERE user_id = 100 AND status = 'paid';

-- 排除某个索引,做对照实验
SELECT * FROM orders IGNORE INDEX (idx_status)
WHERE user_id = 100;

-- 强制使用指定索引
SELECT * FROM orders FORCE INDEX (idx_user_status)
WHERE user_id = 100;

-- UPDATE 与 DELETE 同样支持
DELETE FROM orders FORCE INDEX (idx_user_status)
WHERE user_id = 100 AND status = 'paid';

三种提示对照

提示强度适用场景
USE INDEX弱,缩小候选范围对比不同索引的效果
FORCE INDEX强,优先使用临时规避优化器误判
IGNORE INDEX排除指定索引验证索引是否被误用
作用范围只影响当前语句不适合写进长期方案
把提示当长期方案有风险:数据分布变化后同一个提示可能让计划变得更差。提示适合验证与应急,稳定方案还是调整索引或更新统计信息。
PostgreSQL 没有对应的原生语法:需要干预计划时通常靠调整统计目标、改写 SQL 或借助扩展,不要在语句里硬塞 MySQL 风格的提示。
提示要和 EXPLAIN 配对使用:语句执行成功不代表提示生效,名称拼错或位置不对时会被静默忽略,必须看执行计划是否真的发生变化。
提示只影响当前语句:它不写入表定义也不影响其他会话,且按索引名查找,索引改名后记得同步清理残留的提示。

易错点

  • 把提示写进生产代码当长期方案:数据分布变化后可能反而更慢,适合验证与应急
  • 在 PostgreSQL 里找对应语法:PG 没有原生表级提示,写了会被当成注释或直接报错
  • 提示里的索引名写错:语句能执行但提示被忽略,容易误判为提示无效
  • 用 FORCE INDEX 掩盖数据问题:真正原因可能是统计过期或索引设计不当,先排查根因
  • 多个提示叠加且互相冲突:优化器只能采纳其中一部分,最终计划与预期不符

数据来源与参考

  • MySQL 8.0 Reference Manual · Index Hints
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌