2012-07-08 65 views
0

我感兴趣的查询低于这一权利联接查询太慢

SELECT COUNT(a.id) 
     FROM users AS a 
RIGHT JOIN date_log AS b 
     ON a.id = b.user_id 
    WHERE 
      b.meeting_date BETWEEN '2012-06-01' 
         AND DATE_ADD('2012-06-01', INTERVAL 1 MONTH) 
    GROUP BY a.id 

然而,当我尝试从一个大的数据库中选择数据是太慢了。 我在查询中添加了“group by”条款以删除重复的ID。

有没有更好的方法来完成这项工作?

+4

哪些字段建立索引?你能不能给我们的'SHOW CREATE TABLE users'和'SHOW CREATE TABLE date_log'? – raina77ow 2012-07-08 17:19:44

+0

感谢您的意见的结果,raina.a.id是主键,b.user_id也是,并且b.meeting_date也有索引(KEY'create_date'('meeting_date')) – 2012-07-08 17:25:35

+0

'EXPLAIN'显示什么? – raina77ow 2012-07-08 17:26:32

回答

1

如果你只需要计数,可以让这个查询左连接,看看MySQL有一个更好的时间执行它(我不知道它是如何执行右连接,但我可以想象中相比,左派这是低效的方式...

SELECT users.id, count(users.id) as user_count 
FROM 
    date_log 
    LEFT JOIN users ON date_log.user_id = users.id 
WHERE 
    date_log.meeting_date BETWEEN '2012-06-01' AND DATE_ADD('2012-06-01', INTERVAL 1 MONTH) 
GROUP BY users.id 
+0

谢谢你的建议,ctrahey。我会尽力... – 2012-07-08 17:34:32

+0

我的工作更快速地完成了你的查询。谢谢〜 – 2012-07-08 17:51:30

+0

没问题;我会感谢你的接受;-) – 2012-07-08 17:58:38

1

首先检查您是否为date_log.user_id和meeting_date设置了索引。

那你有没有考虑用'distinct'而不是group?

Select count(distinct a.id) 
+0

太棒了,我会试试这个。谢谢 – 2012-07-08 17:51:54