如何用 MySQL 实现物化视图?
Posted
技术标签:
【中文标题】如何用 MySQL 实现物化视图?【英文标题】:How to implement Materialized View with MySQL? 【发布时间】:2011-02-01 19:59:48 【问题描述】:如何实现物化视图?
如果没有,我该如何使用 mysql 实现物化视图?
更新:
以下方法可行吗?这不会发生在事务中,这是一个问题吗?
DROP TABLE IF EXISTS `myDatabase`.`myMaterializedView`;
CREATE TABLE `myDatabase`.`myMaterializedView` SELECT * from `myDatabase`.`myRegularView`;
【问题讨论】:
看看Materialized Views with MySQL 【参考方案1】:这个帖子比较老了,所以我会尝试重新刷新一下:
我一直在试验甚至在生产环境中部署了几种在 MySQL 中具有物化视图的方法。基本上所有方法都假定您创建一个普通视图并将数据传输到一个普通表 - 实际的物化视图。那么,这只是一个如何刷新物化视图的问题。
这是我目前取得的成功:
-
使用触发器 - 您可以在构建视图的源表上设置触发器。这最大限度地减少了资源使用,因为仅在需要时才进行刷新。此外,物化视图中的数据是实时的
通过存储过程或 SQL 脚本使用 cron 作业 - 定期刷新。您可以更好地控制何时使用资源。显然,您的数据只有在刷新率允许的情况下才是最新的。
使用 MySQL 计划事件 - 类似于 2,但在数据库内部运行
Flexviews - 使用 Justin 提到的 FlexDC。最接近真实的物化
我一直在我的文章Creating MySQL materialized views中收集和分析这些方法及其优缺点
期待有关在 MySQL 中创建物化视图的其他方法的反馈或建议
【讨论】:
【参考方案2】:我维护了一个名为 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 示例要先进得多。
【讨论】:
但是 swanhart-tools 不支持 java? FlexCDC 需要 php 5.3+。它是一个收集二进制日志的外部工具。 Flexviews 的其余部分是由存储的例程(在数据库中存在和运行的程序)构建的。如果您使用 JDBC,则没有理由无法创建/访问 Flexviews 物化视图,因为 JDBC 连接到 MySQL,并且您可以通过 SQL 接口创建/查看/维护视图。【参考方案3】:根据mySQL docs and comments at the bottom of the page,似乎人们正在创建视图,然后从这些视图创建表。不确定此解决方案是否等同于创建物化视图,但它似乎是目前唯一可用的途径。
【讨论】:
【参考方案4】:您的示例近似于“完全刷新”物化视图。如果源表包含数百万或数十亿行,您可能需要经常在数据仓库设置中使用的“快速刷新”视图。
您可以通过使用插入/更新(upsert)将现有“视图表”与源视图的主键(假设它们可以保留键)或保留上次更新的 date_time 来近似快速刷新,并在刷新 SQL 的条件中使用它来减少刷新时间。
另外,考虑使用表重命名,而不是删除/创建,因此可以构建和放置新视图,几乎没有不可用的间隙。首先建立一个新表'mview_new',然后将'mview'重命名为'mview_old'(或删除它),并将'mview_new'重命名为'mview'。在您的上述示例中,当您的 SQL 填充正在运行时,您的视图将不可用。
【讨论】:
以上是关于如何用 MySQL 实现物化视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 Clickhouse 的 AggregatingMergeTree 物化视图中的嵌套字段?