加快postgresql请求

bq3bfh9z  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(1)|浏览(104)
SELECT
    referrer_id, count(id) as referrals_count
FROM users
WHERE referrer_id != 0
GROUP BY referrer_id
order by referrals_count desc
limit 10;

现在我有了这个请求,我检查了执行时间,它是~ 26 ms表与150 k+行。我怎样才能使这个请求更快?
Explain analyze
我尝试在referrer_id字段和索引上创建索引,如:id DESC,但它对我不起作用。

dohp0rv5

dohp0rv51#

没有办法使这个查询特别有效,但是考虑到WHERE子句删除了表的2/3,过滤索引可能会有所帮助。

create index on users (referrer_id, id) where referrer_id<>0;

对我来说,这个索引比seq扫描快5倍,通过在索引中包含“id”,你可以只扫描索引(只要表被很好地清空),通过获取已经按referer_id排序的行,你可以避免hashagg的工作,这种组合使它快得多。
如果“id”字段不为空,那么您可以将count(id)更改为count(*),并将得到相同的结果,这意味着您不再需要在索引中包含“id”来获得仅索引扫描。
如果referrer_id总是〉= 0(对于id列来说很可能是这种情况),那么可以将where子句改为referrer_id > 0,这样就不需要在索引中使用相当深奥的WHERE子句了。
这两种方法结合起来只需要一个referer_id索引,我猜您已经有了这个索引。
但是,如果发送答案比一开始运行查询慢10倍,我会说您处理的是问题的错误部分。

相关问题