如何利用索引PostgreSQL优化查询
我想获取具有1个或多个已处理赌注的用户。我通过使用下一个sql来实现这一点:如何利用索引PostgreSQL优化查询,sql,postgresql,indexing,postgresql-9.3,Sql,Postgresql,Indexing,Postgresql 9.3,我想获取具有1个或多个已处理赌注的用户。我通过使用下一个sql来实现这一点: SELECT user_id FROM bets WHERE bets.state in ('guessed', 'losed') GROUP BY user_id HAVING count(*) > 0; 但运行EXPLAIN ANALYZE时,我注意到没有使用索引,并且查询执行时间非常长。我尝试添加部分索引,如: CREATE INDEX processed_bets_index ON bets(st
SELECT user_id FROM bets
WHERE bets.state in ('guessed', 'losed')
GROUP BY user_id
HAVING count(*) > 0;
但运行EXPLAIN ANALYZE时,我注意到没有使用索引,并且查询执行时间非常长。我尝试添加部分索引,如:
CREATE INDEX processed_bets_index ON bets(state) WHERE state in ('guessed', 'losed');
但请解释分析未更改的输出:
HashAggregate (cost=34116.36..34233.54 rows=9375 width=4) (actual time=235.195..237.623 rows=13310 loops=1)
Filter: (count(*) > 0)
-> Seq Scan on bets (cost=0.00..30980.44 rows=627184 width=4) (actual time=0.020..150.346 rows=626674 loops=1)
Filter: ((state)::text = ANY ('{guessed,losed}'::text[]))
Rows Removed by Filter: 20951
Total runtime: 238.115 ms
(6 rows)
除了(猜测、丢失)一点之外,其他状态的记录
如何创建适当的索引
我使用的是PostgreSQL 9.3.4。我假设状态主要由“猜测”和“失败”组成,可能还有一些其他状态。因此,优化器很可能没有看到使用索引的必要性,因为它仍然会获取大多数行 您需要的是一个关于用户id的索引,因此可能类似这样的东西可以工作:
CREATE INDEX idx_bets_user_id_in_guessed_losed ON bets(user_id) WHERE state in ('guessed', 'losed');
或者,不使用部分索引:
CREATE INDEX idx_bets_state_user_id ON bets(state, user_id);
如果你想讨论两个不同的问题,请在每篇文章中坚持一个问题-发表一个新的问题。如果您愿意,可以在它们之间链接。“除了(猜测、丢失)一点之外,其他状态的记录。”。嗯?我不明白这是什么意思。不管怎样:第一个想法,你是否
分析赌注代码>?有多大比例的行处于猜测状态
和输掉状态(顺便说一句,它是“输掉的”)状态?对不起,我的英语不好)赌注有三种状态:猜测状态、输掉状态和进行中状态。这个比例大约是45/45/10。没有使用部分索引,我得到了预期的结果!谢谢