1. Hint 机制,MySQL 的 USE INDEX、FORCE INDEX、SQL Server 的 OPTION(RECOMPILE)?
MySQL 的 USE INDEX、FORCE INDEX 与 SQL Server 的 OPTION(RECOMPILE) 分别如何使用?它们的作用与适用场景?
- USE INDEX 是建议、FORCE INDEX 是强制,语法与忽略条件
- OPTION(RECOMPILE) 每次执行重新编译,规避参数嗅探但增加编译开销
- Hint 是例外通道而非常规手段
MySQL 的 USE INDEX 是"建议":告诉优化器优先考虑指定索引,但若优化器认为全表扫描或他索引更优仍可忽略;FORCE INDEX 是"强制":要求必须使用指定索引,仅当索引完全不适用(如条件无法匹配该索引)时才退化。两者写在表名后(SELECT * FROM t FORCE INDEX(ix_a) WHERE ...),适合统计失真、优化器选错索引、连接顺序失控时的临时止血;根治仍需刷新统计或调整代价参数。
SQL Server 的 OPTION(RECOMPILE) 让本语句每次执行都重新编译生成新计划,避免计划缓存中的旧计划被复用——常用于参数嗅探导致的首个参数决定后续计划、或数据分布剧烈变化、语句依赖临时表/局部变量的场景,代价是每次多一次编译开销(CPU 上升)且不参与计划缓存。本质:Hint 是"优化器的例外通道",应记录原因、配套回归测试,长期依赖 Hint 而非修统计是反模式。
本题考察两种 Hint 体系的定位差异:MySQL 是"索引层面的建议/强制",SQL Server 是"编译行为层面的强制"。回答时给出语法、适用场景与代价,并强调例外通道的定位。
SELECT * FROM orders FORCE INDEX (idx_user_id) WHERE user_id = 100;
SELECT * FROM orders WHERE user_id = 100 OPTION (RECOMPILE);