“哪些字段能让你快速过滤掉大量无关数据”
换句话说,也就是这个查询条件的区分度足够高 (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,进一步减少查询范围