2017-09-02 31 views
0

我有3個表用戶,訂單和評論每個表有10087250,24949600和26532000多記錄,我做了這個查詢來計算每個訂單的評論,但它需要超過半個小時才能執行,如何加快這個查詢。 注意: foreig_key列上已經有索引。如何在連接查詢中快速獲取數據?

select users.user_name, orders.id, count(comments.order_id) 
    from orders 
inner join users on users.id=orders.user_id 
inner join comments on orders.id=comments.order_id 
group by comments.order_id, users.user_name, orders.id 
limit 2; 

回答

0

您可以嘗試在聚合記錄之前使用臨時表。這可能有助於縮短查詢時間。事情是這樣的......

CREATE TEMPORARY TABLE temp_table(
... 
); 

INSERT INTO temp_table 
SELECT users.user_name, orders.id, comments.order_id 
FROM orders INNER JOIN users ON users.id = orders.user_id INNER JOIN comments ON orders.id = comments.order_id; 

SELECT user_name, id, count(order_id) FROM temp_table group by order_id, user_name, id; 
+0

將無法​​工作,需要大量的時間將數據插入臨時。表。 – HarsHarI

1

對於第一個 - 或許宥需要ORDER BY子句,LIMIT 使用它,如果你最需要的評論對你可以爲了通過計數DESC

第二件事的意見。 order_id = orders.id。你爲什麼同時使用GROUP?

group by comments.order_id, users.user_name, orders.id 

可能是你可以幫助像這樣:

WITH grouped AS (
    SELECT order_id AS id, count(*) 
    FROM comments 
    GROUP BY 1 
    ORDER BY 2 DESC 
    LIMIT 2 
) 
SELECT u.user_name, g.id, g.count 
    FROM grouped AS g 
    JOIN orders AS o ON 
     o.id = g.id 
    JOIN users AS u ON 
     u.id = o.user_id 

這樣避免過濾加盟之前的所有表和分組

+0

我已經這樣做了,以減少查詢的大小,但仍然需要大約3分鐘,因爲我上面提到我的數據庫10087250,24949600和26532000有很多記錄存在那裏尊重表用戶,訂單和評論。查詢有問題嗎?或者在MySql和PostgreSQL的情況下可以說數據庫支持多大的數據量,請給我建議或者提供一些很好的教程,謝謝你的幫助。 – HarsHarI

+0

你想要它嗎? –

+0

是的,我需要它。 – HarsHarI

0

我認爲你需要,以減少不必要的訂單和之間的連接評論表。所有你想從表中得到的是一個訂單的多少評論,所以你需要做非規範化。

這意味着您需要將comments_count列添加到orders表中,並且當每個評論添加到訂單時,只需增加或減少訂單評論即可。

在您添加新的comments_count列後,您需要爲每個訂單更新comments_count

然後你可以加載訂單表,你已經有每個訂單的評論數。