2012-03-27 117 views
1

我有2個表格。複雜的PHP查詢

books (id, sku, name, description, date_added) 

books_views (id, sku, date_viewed) 

我試圖寫一個優化的查詢做到以下幾點。

  1. 要查找上週
  2. 最看的書要找到最看的書上個月

的books_views表中有超過400萬個條目。按周和月查看數據的最佳方式是什麼?

+0

存儲的視圖數量在哪裏?你有什麼嘗試? – jordanm 2012-03-27 19:09:48

+0

@jordanm:據推測,每個視圖都有一個新行添加到'books_views'。 – 2012-03-27 19:10:44

+0

new_row已添加到book_views中。我試圖每晚創建一張桌子books_weekly_views(sku,count),然後使用它,但不要認爲這是有效的。 – daydreamer 2012-03-27 19:12:34

回答

2

查詢是:

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 
+0

你怎麼能有'times_viewed'上的索引?這是一個別名。 – 2012-03-27 19:14:21

+1

當然dateant_viewed。 – Rafe 2012-03-27 19:15:54

+0

很好地工作,但需要大約5.3秒。這可以嗎? – daydreamer 2012-03-27 19:28:30

0

除非你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);