导致查询语句无法使用索引的场景有?(多选题)

导致查询语句无法使用索引的场景有?(多选题)
A. 使用 !=<> 不等值判断
B. 对索引列进行算术运算
C. 索引列使用 IS NULL 判断
D. 前缀通配符查询 %xxx

2 个赞
  • ABD 解析:不等值判断、索引列运算、前导通配符都会造成索引失效;多数场景下 IS NULL 可正常走索引。
1 个赞

正确答案是 A、B、C、D

详细解析:

在关系型数据库(包括 OceanBase 和 MySQL)中,优化器在某些特定条件下会放弃使用索引而选择全表扫描。以上四个选项均属于典型的导致索引失效的场景:

  • :white_check_mark: 选项 A (使用 !=、<> 不等值判断) 正确
    当对索引列使用 !=<> 时,由于需要返回的数据可能占据表中极大的比例,优化器通常会认为走全表扫描的成本比回表查询更低,从而放弃使用该索引。
  • :white_check_mark: 选项 B (对索引列进行算术运算) 正确
    如果在 WHERE 子句中对索引列进行了函数调用或算术运算(例如 col + 1 = 10YEAR(create_time) = 2024 ),数据库无法直接在 B+ 树中定位数据,必须对每一行计算后再比较,这会导致该列上的索引完全失效。
  • :white_check_mark: 选项 C (索引列使用 IS NULL 判断) 正确
    虽然在某些特定情况下(如字段定义为 NOT NULL)IS NULL 可以走索引,但在通用场景下,如果允许为 NULL,NULL 值的存储方式在不同引擎中不一致,且 NULL 代表“未知”,通常会导致优化器放弃使用常规索引。
  • :white_check_mark: 选项 D (前缀通配符查询 %xxx) 正确
    B+ 树索引是按照从左到右的字典序排列的。如果使用 %xxx 这种左侧带有通配符的模糊查询,意味着任何后缀匹配的字符串都有可能命中,这彻底破坏了索引的有序性,必然导致索引失效并触发全表扫描。(注:如果是 xxx% 即右侧通配符,则依然可以使用索引)。