表级索引提示
索引提示写在表名之后,用来强制、限定或忽略候选索引: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 配对使用:语句执行成功不代表提示生效,名称拼错或位置不对时会被静默忽略,必须看执行计划是否真的发生变化。
提示只影响当前语句:它不写入表定义也不影响其他会话,且按索引名查找,索引改名后记得同步清理残留的提示。