1

我有两张桌子:

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

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

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

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

4

1 回答 1

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

于 2012-02-27T20:28:38.257 回答