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