我有两张桌子:
poll_response (poll_id,option_id,user_id) (约500,000行,500个唯一民意调查,1000个独特选项和25000个唯一身份用户)
preferred_users (user_id) (约800行)
我想确定选择每个选项的用户的百分比是“首选用户”(即具有高声誉的用户)。其他用户可以回复民意调查;为了识别响应来自首选用户,preferred_users表需要连接。
这就是我所拥有的:
SELECT option_id, count(*) AS all_votes, count(preferred_users.user_id) AS preferred_votes
FROM response
LEFT JOIN preferred_users ON response.user_id = preferred_users.user_id
GROUP BY option_id
查询会像这样吐出一个表:
| option_id | all_votes | preferred_votes
| 1 | 500 | 150
| 2 | 550 | 250
| 3 | 525 | 300
然后我可以做数学来确定百分比。
问题是查询经常超时 - 这意味着它需要花费一分多钟才能完成。
有没有办法摆脱左连接或以其他方式优化查询?
答案 0 :(得分:1)
您是否尝试将其拆分为两个查询 - 一个用于总计,一个用于首选用户?我怀疑导致它运行缓慢的原因是通过计算非空条目的组中的条目(但你可以通过使用解释看到自己)。
换句话说,:
select option_id, count(*) from response group by option_id
select option_id, count(*) from response, preferred_users where response.user_id = preferred_user.id group by option_id
你甚至可以加入他们:
select * from
(select option_id, count(*) as total from response group by option_id
left join
select option_id, count(*) as preferred from response, preferred_users where response.user_id = preferred_user.id group by option_id
using (option_id))
(不确定我是否有正确的语法,但你明白了。)
另外,你也在preferred_users.id列上有一个索引,对吗?以及从一个到另一个的外键关系?如果没有,请先试试。