19

如何实现物化视图?

如果没有,我如何使用 MySQL 实现物化视图?

更新:

下面的工作吗?这不会发生在事务中,这是一个问题吗?

DROP TABLE IF EXISTS `myDatabase`.`myMaterializedView`;
CREATE TABLE `myDatabase`.`myMaterializedView` SELECT * from `myDatabase`.`myRegularView`;
4

4 回答 4

30

我维护了一个名为 Flexviews ( http://github.com/greenlion/swanhart-tools ) 的项目,它向 MySQL 添加增量可刷新的物化视图(也称为快速刷新),即使对于使用连接和聚合的视图也是如此。我已经为这个项目工作了三年。它包括一个更改数据捕获实用程序来读取数据库日志。不使用触发器。

它包括两种刷新方法。第一个与您的方法类似,只是构建了一个新版本,然后使用 RENAME TABLE 将新版本交换为旧版本。视图在任何时候都不可用于查询,但会在短时间内使用 2 倍的空间。

第二种方法是真正的“快速刷新”,它甚至支持聚合和连接。

有一篇关于它的博客文章: http ://www.mysqlperformanceblog.com/2011/04/04/flexviews-part-3-improving-query-performance-using-materialized-views/

Flexviews 比 asstander 引用的 FromDual 示例要先进得多。

于 2011-04-06T16:52:40.983 回答
2

您的示例近似于“完全刷新”物化视图。如果源表包含数百万或数十亿行,您可能需要经常在数据仓库设置中使用的“快速刷新”视图。

您可以通过使用插入/更新(upsert)将现有“视图表”与源视图的主键(假设它们可以保留键)或保留上次更新的 date_time 并使用它来近似快速刷新在刷新 SQL 的条件下减少刷新时间。

此外,考虑使用表重命名,而不是删除/创建,因此可以构建和放置新视图,几乎没有不可用的间隙。首先建立一个新表'mview_new',然后将'mview'重命名为'mview_old'(或删除它),并将'mview_new'重命名为'mview'。在您上面的示例中,当您的 SQL 填充正在运行时,您的视图将不可用。

于 2010-03-28T21:04:07.717 回答
0

根据页面底部的 mySQL 文档和评论,似乎人们正在创建视图,然后从这些视图创建表。不确定此解决方案是否等同于创建物化视图,但它似乎是目前唯一可用的途径。

于 2013-06-07T17:50:12.540 回答
0

该线程相当旧,因此我将尝试重新刷新一下:

我一直在试验甚至在生产中部署了几种在 MySQL 中具有物化视图的方法。基本上所有方法都假定您创建一个普通视图并将数据传输到一个普通表 - 实际的物化视图。那么,这只是一个如何刷新物化视图的问题。

到目前为止,这是我取得的成功:

  1. 使用触发器 - 您可以在构建视图的源表上设置触发器。这最大限度地减少了资源使用,因为仅在需要时才进行刷新。此外,物化视图中的数据是实时的
  2. 将 cron 作业与存储过程或 SQL 脚本一起使用 - 定期进行刷新。您可以更好地控制何时使用资源。显然,您的数据仅在刷新率允许的范围内是最新的。
  3. 使用 MySQL 计划事件 - 类似于 2,但在数据库内部运行
  4. Flexviews - 使用 Justin 提到的 FlexDC。最接近真实的物化

在我的文章创建 MySQL 物化视图中,我一直在收集和分析这些方法及其优缺点

期待有关在 MySQL 中创建物化视图的其他方法的反馈或建议

于 2018-06-15T07:58:27.287 回答