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个结果
发布于 2015-07-20 00:22:27
使用show create table popularity和show create table products来确定已经到位的索引。
索引会加快性能,但会减慢更新和插入速度。
您需要根据不同的数据处理方式找到正确的索引平衡,所以我并不是说仅仅用索引来修饰表。
发布于 2015-07-25 17:22:37
您对products pr几乎什么都不做,从查询中删除它。这会加速一些事情的发展。(如果你确实需要这张桌子,那就解释一下原因。)
然后,向popularity添加这个包含索引的复合索引将加快它的速度:
INDEX(date, id_product) https://stackoverflow.com/questions/31507300
复制相似问题