优化分组依据和日期函数
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 popularity
和 show create table products
确定您的索引已经到位。
索引可提高性能但会降低更新和插入速度。
您需要根据处理数据的不同方式找到索引的正确平衡,所以我并不是说只在表中添加索引。
您几乎没有对 products pr
执行任何操作,请将其从查询中删除。这会加快一些速度。 (如果您确实需要table,请解释原因。)
然后,将此复合、覆盖、索引添加到 popularity
将加快速度:
INDEX(date, id_product)
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 popularity
和 show create table products
确定您的索引已经到位。
索引可提高性能但会降低更新和插入速度。
您需要根据处理数据的不同方式找到索引的正确平衡,所以我并不是说只在表中添加索引。
您几乎没有对 products pr
执行任何操作,请将其从查询中删除。这会加快一些速度。 (如果您确实需要table,请解释原因。)
然后,将此复合、覆盖、索引添加到 popularity
将加快速度:
INDEX(date, id_product)