我有2個表格。複雜的PHP查詢
books (id, sku, name, description, date_added)
和
books_views (id, sku, date_viewed)
我試圖寫一個優化的查詢做到以下幾點。
- 要查找上週
- 最看的書要找到最看的書上個月
的books_views表中有超過400萬個條目。按周和月查看數據的最佳方式是什麼?
我有2個表格。複雜的PHP查詢
books (id, sku, name, description, date_added)
和
books_views (id, sku, date_viewed)
我試圖寫一個優化的查詢做到以下幾點。
的books_views表中有超過400萬個條目。按周和月查看數據的最佳方式是什麼?
查詢是:
SELECT sku, count(*) AS times_viewed
FROM book_views bv
WHERE date_viewed > DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY sku
ORDER BY times_viewed DESC
要獲得當月的意見,改變時間間隔爲30天。
爲了加快速度,您需要確保表格已正確編制索引。您肯定會需要date_viewed
的索引。如果您還想要書名,則需要在兩個表中索引sku
列。以下是您如何獲取書名的方法。
SELECT bv.sku, name, count(*) AS times_viewed
FROM book_views bv JOIN books b ON bv.sku = b.sku
WHERE date_viewed > DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY bv.sku
ORDER BY times_viewed DESC
你怎麼能有'times_viewed'上的索引?這是一個別名。 – 2012-03-27 19:14:21
當然dateant_viewed。 – Rafe 2012-03-27 19:15:54
很好地工作,但需要大約5.3秒。這可以嗎? – daydreamer 2012-03-27 19:28:30
除非你books_views表有,你是不是在這裏展示您應該將意見表改到其他領域 - 與SKU和date_viewed的PK books_views (sku, date_viewed, views)
。
然後修改您的插入是在DUP鍵插入 -
INSERT INTO books_views VALUES ('sku', CURRENT_DATE, 1)
ON DUPLICATE KEY UPDATE views = views + 1;
如果你想要最好的性能,假設比插入更多的更新,你可以做 -
UPDATE books_views
SET views = views + 1
WHERE sku = 'sku'
AND date_viewed = CURRENT_DATE;
然後檢查的受影響的行數,然後在沒有行受影響的情況下插入 -
INSERT INTO books_views VALUES ('sku', CURRENT_DATE, 1);
存儲的視圖數量在哪裏?你有什麼嘗試? – jordanm 2012-03-27 19:09:48
@jordanm:據推測,每個視圖都有一個新行添加到'books_views'。 – 2012-03-27 19:10:44
new_row已添加到book_views中。我試圖每晚創建一張桌子books_weekly_views(sku,count),然後使用它,但不要認爲這是有效的。 – daydreamer 2012-03-27 19:12:34