如何实现物化视图?
如果没有,我如何用MySQL实现Materialized View?
更新
以下工作会怎样?这在事务中不会发生,这是一个问题吗?
DROP TABLE IF EXISTS `myDatabase`.`myMaterializedView`;
CREATE TABLE `myDatabase`.`myMaterializedView` SELECT * from `myDatabase`.`myRegularView`;
答案 0 :(得分:30)
我维护了一个名为Flexviews(http://github.com/greenlion/swanhart-tools)的项目,该项目将增量可刷新的物化视图添加到MySQL(即快速刷新),即使对于使用连接和聚合的视图也是如此。我已经在这个项目上工作了三年。它包括一个用于读取数据库日志的更改数据捕获实用程序。没有使用触发器。
它包括两个刷新方法。第一个类似于您的方法,除了构建新版本,然后RENAME TABLE用于交换旧版本。在任何时候,视图都不可用于查询,但是空间的使用时间是2倍。
第二种方法是真正的“快速刷新”,它甚至支持聚合和连接。
Flexviews远远高于旁观者引用的FromDual示例。
答案 1 :(得分:2)
您的示例近似于“完全刷新”物化视图。如果源表包含数百万或数十亿行,则可能需要“快速刷新”视图(通常在数据仓库设置中使用)。
您可以通过使用插入/更新(upsert)将现有“视图表”与源视图的主键连接(假设它们可以被密钥保留)或保留上次更新的date_time来近似快速刷新,并在刷新SQL的标准中使用它来减少刷新时间。
此外,考虑使用表重命名,而不是删除/创建,因此可以构建新视图并将其放置到几乎没有不可用的间隙。首先构建一个新表'mview_new',然后将'mview'重命名为'mview_old'(或删除它),并将'mview_new'重命名为'mview'。在上面的示例中,当您的SQL填充正在运行时,您的视图将不可用。
答案 2 :(得分:0)
根据mySQL docs and comments at the bottom of the page,似乎人们正在创建视图,然后从这些视图创建表。不确定此解决方案是否等同于创建物化视图,但它似乎是目前唯一可用的途径。
答案 3 :(得分:0)
这个帖子比较陈旧,所以我会尝试重新刷新一点:
我一直在尝试甚至在生产中部署了几种在MySQL中实现物化视图的方法。基本上所有方法都假设您创建普通视图并将数据传输到普通表 - 实际的物化视图。然后,这只是一个如何刷新物化视图的问题。
到目前为止,这是我取得的成就:
在我的文章Creating MySQL materialized views
中,我一直在收集和分析这些方法及其优缺点寻找有关在MySQL中创建物化视图的其他方法的反馈或建议