2012-07-08 64 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