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