我有2张桌子。
books (id, sku, name, description, date_added)
和
books_views (id, sku, date_viewed)
我正在尝试编写一个优化查询来执行以下操作。
books_views表有超过400万条目。根据周和月的视图对数据进行排序的最佳方法是什么?
答案 0 :(得分: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
答案 1 :(得分:0)
除非您的books_views表中包含您未在此处显示的其他字段,否则您应该使用sku和date_viewed上的PK将您的观看表更改为 - books_views (sku, date_viewed, views)
。
然后将您的插入修改为双键上的插入 -
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);