2014-09-20 155 views
0

此查詢有多個JOIN包括功能執行極其緩慢MySQL查詢

執行這個查詢大約6000個用戶用了20秒。

是否有任何其他方法可以更快地運行此查詢?

SELECT users.id, SUM(orders.totalCost) AS bought, COUNT(comment.id) AS commentsCount, COUNT(topics.id) AS topicsCount, COUNT(users_login.id) AS loginCount, COUNT(users_download.id) AS downloadsCount 
FROM users 
LEFT JOIN orders ON users.id=orders.userID AND orders.status=1 
LEFT JOIN comment ON users.id=comment.userID 
LEFT JOIN topics ON users.id=topics.userID 
LEFT JOIN users_login ON users.id=users_login.userID 
LEFT JOIN users_download ON users.id=users_download.userID 
WHERE users.id='$userID' 
GROUP BY users.id 
ORDER BY `bought` DESC 

運行的結果解釋 enter image description here

+3

確保您的表格列已正確編制索引。 – PHPglue 2014-09-20 06:35:12

+0

@PHPglue你能解釋一下嗎?或者給我一個例子?我知道主鍵和唯一索引,但我沒有足夠的索引鍵信息 – 2014-09-20 06:39:06

+1

運行EXPLAIN的結果是什麼? – 2014-09-20 07:10:39

回答

1

解釋輸出顯示你正在做的一切全表掃描,除了users。您需要在聯接中的所有其他表上創建第二個(非唯一)索引userID。這將加速對個人用戶的查詢。

但是,如果您要一次處理所有用戶,請在沒有WHERE users.id=子句的情況下執行一次選擇。您的聚合每個用戶只返回一行,您應該創建一個包含所有行的結果集並對其進行迭代,而不是爲每個用戶重新發布一次查詢。在這種情況下,二級索引可能仍然有幫助,因爲可以單獨從索引確定計數,而無需查看錶本身。