复杂PHP查询

复杂PHP查询,php,mysql,Php,Mysql,我有两张桌子 books (id, sku, name, description, date_added) 及 我正在尝试编写一个优化的查询来执行以下操作 查找上周浏览量最大的书籍 查找上个月浏览量最大的书籍 books_views表有超过400万个条目。获取按周和月视图排序的数据的最佳方法是什么?查询是: SELECT sku, count(*) AS times_viewed FROM book_views bv WHERE date_viewed > DATE_SUB(NOW(),

我有两张桌子

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

我正在尝试编写一个优化的查询来执行以下操作

  • 查找上周浏览量最大的书籍
  • 查找上个月浏览量最大的书籍
  • 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天

    为了加快速度,您需要确保表已正确索引。您肯定需要查看日期的索引。如果您还想要图书名称,那么您需要为两个表中的
    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
    

    除非您的“图书视图”表中有其他未显示的字段,否则您应该将“视图”表更改为-
    图书视图(sku、查看的日期、视图)
    ,并在sku和查看的日期上显示PK

    然后将插入修改为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:大概每个视图都会在
    books\u视图中添加一个新行。在book\u视图中会添加一个新行。我试着每天晚上创建一个表来查看每周的图书(sku,count),然后使用它,但我认为这不是很有效。其中一个字段是外键吗?你怎么能在查看的次数上有一个索引?这是一个别名。工作正常,但需要大约5.3秒。这样可以吗?这并不奇怪的慢。很可能你会希望每晚进行汇总,然后用这些数据查询表以保持快速。是的,我想我只需要每月创建一次book\u views\u,每周创建一次book\u views\u,然后每晚使用cron生成这些表并使用它们。这样做的速度非常快。date_是日期字段还是日期时间字段?
    
    INSERT INTO books_views VALUES ('sku', CURRENT_DATE, 1);