Mysql 如何有效地聚合视图中的相关对象计数?

Mysql 如何有效地聚合视图中的相关对象计数?,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,想象一下这个场景: 我的数据库中有三个表:Products、Users和like,后者表示产品和用户之间的关系。现在我有一个查询,它将产品与Likes表连接起来,计算一个产品得到了多少like 事实上,我比实际用户更需要有关计数的信息,我希望将上面的查询用作视图中更大查询的一部分。有没有可能优化查询或视图,以便MySQL以某种方式缓存上面计数查询的结果?我不知道用MySQL实现这一点的方法,但我主要使用postgres,所以这可能是可能的,我只是不知道。我建议两种选择: 如果您需要缓存尽可能保持

想象一下这个场景:

我的数据库中有三个表:Products、Users和like,后者表示产品和用户之间的关系。现在我有一个查询,它将产品与Likes表连接起来,计算一个产品得到了多少like


事实上,我比实际用户更需要有关计数的信息,我希望将上面的查询用作视图中更大查询的一部分。有没有可能优化查询或视图,以便MySQL以某种方式缓存上面计数查询的结果?

我不知道用MySQL实现这一点的方法,但我主要使用postgres,所以这可能是可能的,我只是不知道。我建议两种选择:

如果您需要缓存尽可能保持最新,请在Products表中添加likes_count列,在likes表上创建AFTER INSERT和AFTER DELETE触发器,假设您从未更新该表,该表在向likes表插入新行时增加产品的like count,在删除行时减少。然后,添加一个cronjob,偶尔执行更新产品集likes\u count=SELECT COUNT1 FROM likes WHERE product\u id=Products.id,以确保值真正是最新的-使用触发器维护计数永远不会100%准确。 另一个选项是创建一个视图作为创建视图产品\u Likes\u视图作为选择产品\u id,计数*作为Likes\u COUNT FROM Likes GROUP BY product\u id;,并创建一个缓存表,类似于创建表产品,类似于缓存产品,类似于整数主键,类似于计数整数不为空;。然后,添加一个执行BEGIN的cronjob;截断缓存中的产品;插入到Products_Likes_Cache中,从Products_Likes_视图中选择*;犯罪将缓存表与视图中的最新信息同步。然后,如果需要精确的结果,可以直接从视图中获取数据。否则,请使用缓存表。 如果使用第一个选项,触发器应该是这样的。我的MySQL技能有点生疏,我可能不太懂确切的语法:

CREATE TRIGGER product_increase_likes AFTER INSERT ON Likes
    FOR EACH ROW BEGIN
        UPDATE Products SET likes_count=likes_count+1 WHERE id=NEW.product_id
    END;

CREATE TRIGGER product_decrease_likes AFTER DELETE ON Likes
    FOR EACH ROW BEGIN
        UPDATE Products SET likes_count=likes_count-1 WHERE id=OLD.product_id
    END;

您不应该需要加入来计算产品的喜好

SELECT product, count(*) 
FROM likes
GROUP BY product;

如果您使用WHERE子句,应该会很快被删除。

感谢您非常详细的回答和实际示例!