2015-07-20 83 views
0
SELECT p.id_product 
      FROM popularity p, products pr 
      WHERE p.id_product = pr.id_product 
       AND p.date >= (DATE_SUB(CURDATE(), INTERVAL 30 DAY)) 
       GROUP BY p.id_product order by count(p.id_product) desc LIMIT 0, 6 

我想知道如何儘可能優化我的查詢。我試圖削減脂肪,特別是這個查詢給我帶來了麻煩,因爲它在任何地方都被使用。我有一個表格,用於存儲正在訪問的產品頁面的每個實例,以及另一個包含產品的表格。優化Group By和Date函數

p.id_product是一個非唯一鍵,而pr.id_product是產品的表主鍵。我不認爲我正在執行我的查詢,因爲看起來我正在做一個完整的索引掃描來完成兩個表之間的連接。我不確定以這種方式調用DATE_SUB是最好的主意(我正在查看過去的一個月),或者我的小組/訂單是否正確。我的數據庫的表也在InnoDB上運行。

有什麼辦法可以讓這個更快嗎?我已經設置了查詢限制,因爲我注意到該軟件從未使用超過6個結果

回答

1

使用show create table popularityshow create table products來確定您的索引已經到位。

索引加速性能,但更新和插入緩慢。

您需要根據不同的數據處理方式找到合適的索引平衡點,所以我不是一個人可以用索引來胡說。

+0

表已經有一堆指標。受歡迎的id_product是索引,產品中的id_product是主鍵。當然他們是 – Sefam

+0

。我看到的是日期專欄(012)關注 – Drew

+0

。我爲產品ID和日期添加了一個索引。現在就像魅力一樣。 – Sefam

0

您正在做什麼與products pr幾乎沒有,從查詢中刪除它。這會加速一些事情。 (如果您需要的表,然後解釋爲什麼。)

然後,加入這種複合,覆蓋,指數popularity則會加速這一過程:

INDEX(date, id_product)