or为什么命不中索引(or为什么不走索引)
- 作者: 李芸汐
- 来源: 投稿
- 2024-09-18
一、or为什么命不中索引
索引未命中原因:
1. 索引未创建或未正确创建
确保已为相关列创建索引。
检查索引定义是否正确,包括列顺序和索引类型。
2. 查询未使用索引
查询中使用的列未包含在索引中。
查询条件不满足索引的条件。例如,范围查询可能无法使用索引。
3. 索引统计信息已过时
索引统计信息未反映表中的最新数据。
运行 `ANALYZE` 命令更新索引统计信息。
4. 表已分区
分区表中的索引仅适用于特定分区。
确保查询正在访问包含索引的分区。
5. 查询优化器选择不使用索引
查询优化器可能决定不使用索引,因为其他访问路径更有效。
考虑调整查询以强制使用索引。
6. 索引被禁用或不可用
索引可能已被禁用或由于其他原因而不可用。
检查索引状态并根据需要重新启用或修复索引。
7. 数据类型不匹配
索引列的数据类型与查询中使用的列的数据类型不匹配。
确保数据类型兼容。
8. 索引列包含空值
索引列包含空值,这可能会阻止索引命中。
考虑使用 `COALESCE()` 或其他函数处理空值。
9. 查询中使用函数或表达式
查询中使用的函数或表达式可能会阻止索引命中。
考虑重写查询以避免使用函数或表达式。
10. 表锁
表锁可能会阻止索引命中。
尝试在不锁定表的情况下运行查询。
二、or为什么不走索引
索引未创建表上没有为查询中使用的列创建索引。
索引未使用查询条件不满足索引使用的条件。例如:
范围查询未包含索引的起始或结束值。
索引列中包含 NULL 值。
索引统计信息已过时
索引统计信息已过时,导致优化器无法准确估计索引的使用成本。
索引碎片索引碎片过多,导致索引扫描效率低下。
表锁表已锁定,阻止索引使用。
查询计划缓存
查询计划已缓存,并且未考虑索引的最新更改。
优化器设置优化器设置不正确,导致索引未被使用。
其他原因查询中使用了不兼容索引的函数或表达式。
表中数据分布不均匀,导致索引效率低下。
硬件或软件问题导致索引无法使用。