索引失效的各种原因
索引失效的各种原因
收藏
复制链接
微信扫码分享
在小程序上查看
分享
2条回答
默认
最新
不能用
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
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏

