正在加载

or为什么命不中索引(or为什么不走索引)

  • 作者: 李芸汐
  • 来源: 投稿
  • 2024-09-18


一、or为什么命不中索引

索引未命中原因:

1. 索引未创建或未正确创建

确保已为相关列创建索引。

检查索引定义是否正确,包括列顺序和索引类型。

2. 查询未使用索引

查询中使用的列未包含在索引中。

查询条件不满足索引的条件。例如,范围查询可能无法使用索引。

3. 索引统计信息已过时

索引统计信息未反映表中的最新数据。

运行 `ANALYZE` 命令更新索引统计信息。

4. 表已分区

分区表中的索引仅适用于特定分区。

确保查询正在访问包含索引的分区。

5. 查询优化器选择不使用索引

查询优化器可能决定不使用索引,因为其他访问路径更有效。

考虑调整查询以强制使用索引。

6. 索引被禁用或不可用

索引可能已被禁用或由于其他原因而不可用。

检查索引状态并根据需要重新启用或修复索引。

7. 数据类型不匹配

索引列的数据类型与查询中使用的列的数据类型不匹配。

确保数据类型兼容。

8. 索引列包含空值

索引列包含空值,这可能会阻止索引命中。

考虑使用 `COALESCE()` 或其他函数处理空值。

9. 查询中使用函数或表达式

查询中使用的函数或表达式可能会阻止索引命中。

考虑重写查询以避免使用函数或表达式。

10. 表锁

表锁可能会阻止索引命中。

尝试在不锁定表的情况下运行查询。

二、or为什么不走索引

索引未创建

表上没有为查询中使用的列创建索引。

索引未使用

查询条件不满足索引使用的条件。例如:

范围查询未包含索引的起始或结束值。

索引列中包含 NULL 值。

索引统计信息已过时

索引统计信息已过时,导致优化器无法准确估计索引的使用成本。

索引碎片

索引碎片过多,导致索引扫描效率低下。

表锁

表已锁定,阻止索引使用。

查询计划缓存

查询计划已缓存,并且未考虑索引的最新更改。

优化器设置

优化器设置不正确,导致索引未被使用。

其他原因

查询中使用了不兼容索引的函数或表达式。

表中数据分布不均匀,导致索引效率低下。

硬件或软件问题导致索引无法使用。