暂无图片
分享
suger
2023-05-06
索引失效的各种原因

索引失效的各种原因

收藏
分享
2条回答
默认
最新
T
Ty3306

不能用

invalid索引
可能是创建中途被取消,也可以手动置为invalid。注意这种索引虽然不能用,但还是会被更新,增加开销。
update pg_index set indisvalid=false where indexrelid='i_ii'::regclass;

不支持的条件类型,例如hash index不支持范围查询
列与索引字符集/排序规则不一致(例如表关联字段)
隐式转换
软解析使用缓存的全表扫描执行计划,后续默认不会再解析生成新执行计划
hint固定执行计划
非SARG条件:
字段上用函数,immutable类型函数可以建函数索引
字段上做运算
非操作符条件,not in 、<> 、!= 、not like
like左边带%(使用pg_trgm插件创建gin索引除外)
数据库认为索引unsafe:开启old_snapshot_threshold参数,存在HOT Broken chain
不想用

优化器认为走索引cost比全表扫描更高

查询/返回数据量占比过大,可以再细分几种场景:
很小的表,例如10行的表返回9行
大表,但符合条件的过多(例如字段in大量值)
唯一值过少(例如性别)
数据倾斜(例如deleted=0 10行,deleted=1 99999行)
统计信息过旧(包括没有统计信息),执行计划估算错误
关联度:列物理顺序与逻辑顺序的相关性(统计信息中的correlation字段)
不符合最左原则
重复的索引
优化器刺客 limit,pg会倾向于不走索引,但在符合条件的数据非常少时,可能会有严重的性能问题 

暂无图片 评论
暂无图片 有用 0
暂无图片
suger
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏