优化分组依据和日期功能

时间:2015-07-20 00:13:58

标签: mysql query-optimization

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

我想知道如何尽可能优化我的查询。我试图削减脂肪,特别是这个问题给了我麻烦,因为它在任何地方都被使用。我有一个表格,其中存储了所访问的产品页面的每个实例,以及另一个包含产品的表格。

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

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

2 个答案:

答案 0 :(得分:1)

使用show create table popularityshow create table products确定已有的索引。

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

你需要根据追踪数据的不同方式找到正确的索引平衡,所以我不能说只是用表格来加工表。

答案 1 :(得分:0)

您对products pr几乎没有任何作用,请将其从查询中删除。这会加速一些事情。 (如果你需要表格,那么解释原因。)

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

INDEX(date, id_product)