可以在'首选用户'的MySQL查询中优化左连接吗?

时间:2012-02-27 19:27:39

标签: mysql query-optimization left-join database-optimization

我有两张桌子:

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

然后我可以做数学来确定百分比。

问题是查询经常超时 - 这意味着它需要花费一分多钟才能完成。

有没有办法摆脱左连接或以其他方式优化查询?

1 个答案:

答案 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列上有一个索引,对吗?以及从一个到另一个的外键关系?如果没有,请先试试。