优化分组依据和日期函数

Optimizing Group By and Date functions

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

我想知道如何尽可能优化我的查询。我正在尝试 trim 减少脂肪,这个查询尤其给我带来麻烦,因为它无处不在。我有一个 table,其中我存储了正在访问的产品页面的每个实例,另一个 table 包含产品。

p.id_product 是非唯一键,而 pr.id_product 是产品的 table 主键。我认为我的查询不正确,因为看起来我正在执行完整的索引扫描以在两个 table 之间进行连接。而且我不确定以这种方式调用 DATE_SUB 是最好的主意(我正在查看过去一个月),或者我的 group/order 是否正确。我的数据库 table 也 运行 关闭了 InnoDB。

有什么方法可以让它更快吗?我已经对查询设置了限制,因为我注意到该软件从不使用超过 6 个结果

使用 show create table popularityshow create table products 确定您的索引已经到位。

索引可提高性能但会降低更新和插入速度。

您需要根据处理数据的不同方式找到索引的正确平衡,所以我并不是说只在表中添加索引。

您几乎没有对 products pr 执行任何操作,请将其从查询中删除。这会加快一些速度。 (如果您确实需要table,请解释原因。)

然后,将此复合、覆盖、索引添加到 popularity 将加快速度:

INDEX(date, id_product)