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