SQL面试题更新 2026-08-03

请列举SQL查询中索引无法被有效使用的典型场景,并说明其失效的根本原因。

考察说明

考察对索引失效机制的理解,包括优化器行为和常见误用。

回答思路

  1. 【回答框架 1】索引失效的根本原因是查询条件或数据分布导致优化器认为全表扫描更高效,或索引结构无法匹配查询需求。常见情况包括:对索引列使用函数或计算、隐式类型转换、模糊匹配前导通配符、OR连接非索引列、以及LIKE条件等。
  2. 【回答框架 2】函数或计算:在WHERE子句中对索引列使用函数(如DATE())或算术运算(如col+1)会破坏索引列的原样值,优化器无法直接定位,导致索引失效。即使表达式可优化,也建议改写为对绑定变量或常量的操作。
  3. 【回答框架 3】隐式类型转换:当索引列与传入参数类型不一致时,数据库可能发生隐式转换,转换后的列不再使用索引。例如字符串列与数字比较,或日期列与字符串比较,应确保参数类型与列类型一致。
  4. 【回答框架 4】模糊查询:使用前导通配符(如'%abc')会使得索引无法按顺序扫描,但后导通配符('abc%')通常仍可用索引。针对前导通配符,可考虑全文索引或反向索引等替代方案。
  5. 【回答框架 5】OR与范围条件:如果OR连接的多个条件中,某个条件的列没有索引或索引选择性极差,优化器可能放弃整体使用索引。此外,范围查询(如BETWEEN、IN)如果范围过大,也可能导致全表扫描。
  6. 【关键点 1】对索引列使用函数或计算会导致索引失效。
  7. 【关键点 2】隐式类型转换会阻止索引使用。
  8. 【关键点 3】前导通配符的LIKE查询无法利用索引。
  9. 【关键点 4】OR条件中部分列无索引时可能全表扫描。
  10. 【关键点 5】优化器基于成本决定是否使用索引,统计信息也很重要。
  11. 【易错点 1】认为索引一定加速查询,忽略了低选择性列(如性别)的索引可能无益。
  12. 【易错点 2】混淆索引失效与索引未被选用,某些情况下优化器选择全表扫描是合理的。
  13. 【易错点 3】忽略复合索引的最左前缀原则,导致部分查询无法使用索引。