在使用 OceanBase 时遇到明明建了索引,SQL 却没走到的情况。
想问大家:
- OB 中哪些 SQL 写法最容易导致索引失效?
- 隐式转换、函数运算、字段类型不匹配在 OB 里的影响有多大?
- 有哪些工具或方法能快速定位索引未命中原因?
希望总结一套避坑指南。
在使用 OceanBase 时遇到明明建了索引,SQL 却没走到的情况。
想问大家:
对索引列使用函数或表达式
示例: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
影响:数据库会对索引列进行类型转换,导致索引失效。
统计信息过时或缺失
影响:优化器根据过时的统计信息错误地判断索引的选择性,从而选择全表扫描而非索引。
学习一下