OceanBase 索引失效常见场景有哪些?如何提前预防?

在使用 OceanBase 时遇到明明建了索引,SQL 却没走到的情况。
想问大家:

  1. OB 中哪些 SQL 写法最容易导致索引失效?
  2. 隐式转换、函数运算、字段类型不匹配在 OB 里的影响有多大?
  3. 有哪些工具或方法能快速定位索引未命中原因?
    希望总结一套避坑指南。
2 个赞
  • 对索引列使用函数或表达式

  • 示例:WHERE DATE(create_time) = '2024-01-01'WHERE col + 1 = 100

  • 影响:数据库无法使用索引,因为索引存储的是原始值,而非函数计算后的值。

  • 使用 NOT IN<>, != 等否定条件

  • 示例:WHERE status NOT IN (0, 1)

  • 影响:优化器通常会选择全表扫描,因为否定条件覆盖的范围太广,索引的选择性变差。

  • 使用 OR 连接多个条件,且部分条件无索引

  • 示例:WHERE idx_col = 1 OR no_idx_col = 2

  • 影响:如果 OR 两侧的条件不能同时命中索引,整个查询可能会退化为全表扫描。

  • LIKE 查询以通配符开头

  • 示例:WHERE name LIKE '%abc'

  • 影响:索引是有序的,前缀匹配可以利用索引,但后缀匹配无法利用有序性,导致索引失效。

  • 隐式类型转换

  • 示例:索引列是 VARCHAR,查询条件是数字 WHERE id = 123

  • 影响:数据库会对索引列进行类型转换,导致索引失效。

  • 统计信息过时或缺失

  • 影响:优化器根据过时的统计信息错误地判断索引的选择性,从而选择全表扫描而非索引。

1 个赞

学习一下