我有n个(源)表,它们具有相同的结构,每个表都有几百万行。这些表中的每一个都定期从不同来源接收新数据。
(例如:销售表。每家商店都有自己的销售表。每天有1000家商店销售数十万件商品。你会如何组合这些商品?)
我想将它们合并到一个摘要表中。我希望任何源表中的更改都反映在摘要上,并且摘要上的更改将反映在相应的源表中。
(例如:销售表。当新销售发生时,汇总表会更新。如果在汇总表中对销售进行了更改,则会反映在相应的商店表中。)
我可以看到三种解决方案。
1.创建一个事件/触发器,它将在给定时间或插入/更新/删除后刷新我的汇总表。 类似的东西:
#Some event triggers this
DROP TABLE table_summary;
INSERT INTO table_summary
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
UNION ALL
SELECT * FROM tablen...
我认为,这里的缺点是性能,我不认为每次在其中一个表上有INSERT/UPDATE/DELETE
时我都能负担得起这个查询。
2.创建一个视图。
CREATE VIEW table_summary AS
SELECT * FROM table1
UNION ALL
SELECT * FROM table2;
#This query takes 90s to complete
性能方面,我遇到与解决方案#1相同的问题
3.为每个表创建一个INSERT/UPDATE/DELETE
触发器。这是很多触发器和MySQL限制为每个表一个。我开始这样,但维护代码脚手架看起来令人印象深刻,可能难以维护。
我确信这是一个我没有想到的更好的方式。