2014-02-15 46 views
2

我有一個Web應用程序,我使用2個表,一個用於存儲產品信息,另一個用於存儲每個產品的投票。MySQL查詢基於投票加入2個表

現在我想根據產品得票數來顯示產品。下面是表結構

產品:

PRODUCT_ID TITLE 
1   product1 
2   product2 
3   product3 
4   product4 

投票:

PRODUCT_ID USER_ID 
1   1 
1   1 
2   2 
3   2 

而且我期待的結果,在下降的選票,以顯示產品

PRODUCT_ID TITLE   VOTES 
1   product1  2 
2   product2  1 
3   product3  1 

目前我正在使用這樣的查詢

SELECT p.product_id, p.title, count(*) AS total FROM products p 
INNER JOIN votes v ON v.product_id = p.product_id GROUP BY p.product_id 
ORDER BY count(*) DESC LIMIT 110 

產品表有大約30,000條記錄,並且投票表有大約90,000條記錄。

現在問題是需要很多時間(隨機在18到30秒之間)。由於表格中的記錄數量並不高,我不知道爲什麼需要這麼多時間。

有一點需要注意的是,當我第二次運行查詢時,它以幾毫秒的時間獲取結果,我認爲這是一個非常複雜的查詢的理想時間。

我再次對編程的數據庫方面很陌生。

我不確定查詢中是否有任何錯誤,或者它是不是有效的表結構(至少要快速獲取記錄)。

+0

查詢看起來不太好,你需要選擇從投票而不是產品,因爲你正在做計數,其次你需要使用EXPLAIN select ...(你的查詢看看有什麼說) –

+0

謝謝對於這個建議,我會改變查詢來選擇票數 – Questions

+0

道歉你不需要改變它,但你可以從產品中選擇!!它應該工作,我誤解了這個問題。 –

回答

1

首先,查詢是好的,但我會傾向於以不同的方式格式化:

SELECT p.product_id, p.title, count(*) AS total 
FROM products p INNER JOIN 
    votes v 
    ON v.product_id = p.product_id 
GROUP BY p.product_id 
ORDER BY count(*) DESC 
LIMIT 110; 

作爲另一個答覆中提到,在votes(product_id)指數肯定會幫助查詢,如果你沒有一個已經。即使join表現有所改善,您仍然有聚合的開銷。而且,在MySQL中可能會有很多開銷。

如果您希望得到更多的票數 - 進入數百萬人 - 那麼您可能需要採取另一種方法。一種方法是在某個表中添加一個觸發器(可能是products表,它會在進入時跟蹤投票。)然後查詢會飛。另一種方法是週期性地總結數據,類似於使用觸發器,但使用