如何用MySQL实现物化视图?

时间:2010-03-28 20:50:55

标签: mysql database views materialized-views

如何实现物化视图?

如果没有,我如何用MySQL实现Materialized View?

更新

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

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

4 个答案:

答案 0 :(得分: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远远高于旁观者引用的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中实现物化视图的方法。基本上所有方法都假设您创建普通视图并将数据传输到普通表 - 实际的物化视图。然后,这只是一个如何刷新物化视图的问题。

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

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

    中,我一直在收集和分析这些方法及其优缺点

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