Access denied, Please sign in and make sure you have proper permission.
而且创建了索引之后,他的执行时间也非常高,希望得到大家的指点
查询条件太多了,索引很难利用好,另外你好多条件都是字符串,为什么不用 int
这就是回表的。因为你有大量索引外的字段。如果只查索引的叫 index only scan。
其实是不是回表无所谓。因为业务拼装的 SQL 可能性很多。一般建立索引是快速缩小范围,然后再回表查。你可以用“哪些字段能让你快速过滤掉大量无关数据”的原则来建立索引。
“哪些字段能让你快速过滤掉大量无关数据”
换句话说,也就是这个查询条件的区分度足够高 (selectivity)。带有 unique index 的 column 区分度最高,因为表里每条记录的值都不一样,即使是有几百万行的表,通过 B Tree 索引,只需要几次 IO 就能找到对应的记录。高区分度 => 查询范围小 => 快 🚀
通过 pg_stats 看各个字段的值的分布情况。比如一个枚举字段 status
,各个值的出现频率是 ({done: 0.9, failed: 0.08, pending: 0.02}
),那 status = pending
就是一个高区分度的查询条件,因为它能过滤掉 99.8% 的数据。
你甚至可以给一个高区分度的查询条件建一个partial index,进一步减少查询范围