1

我有两个表:可以在“首选用户”MySQL查询中优化左连接吗?

poll_response(poll_id,option_id,USER_ID) (约50万行数据,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

你对这些表有什么索引? – 2012-02-27 20:00:50

+0

BTREE索引每个列在poll_response – jawns317 2012-02-27 20:13:45

回答

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

+0

这样的工作(将很好知道某些...)? – 2012-02-28 01:44:56