PostgreSQL for MySQL DBA 系列的第 8 集介绍了物化视图。MySQL 有视图很多年了,它们非常有用,但它从来没有物化视图。那些使用物化视图的人欣赏它们的实用性,在这里我们将介绍它们是如何使用的。这一集从常规的非物化视图开始,以帮助那些不习惯使用它们的人,然后转向物化视图,以便您可以看到不同之处。
快速回顾:为什么要查看?
视图通常用于向用户隐藏基础列和表名称。这种混淆效果很好,因为用户可能有权查询视图但被拒绝访问基表。通过让用户标准化使用视图来获取所需的列,它确实简化了事情。它允许加入过程并将多个表的使用简化为单个虚拟表。视图成为所需数据的“通用”简写。它还可以在一致的接口后面封装表结构的细节,这些细节可能会随着应用程序的发展而改变。
视图是汇总值(如 SUM()、AVG() 等)的好地方,可将计算与“纯”数据分开。与桌子相比,它们占用的空间很小。视图可以构建在其他视图之上,并且视图可以像表格一样使用。
基本观点
让我们从一个简单的表和相应的简单数据开始。
1
2
3
4
test=# create table base (a int, b int, c int);
CREATE TABLE
test=# insert into base values (1,2,3),(4,5,6),(7,8,9);
INSERT 0 3
我们的第一个视图从上表中提取值。
1
2
3
<span style="font-weight: 400;">test=# </span><b>create view v1 as SELECT a, b, c*4 from base;</b>
<span style="font-weight: 400;">CREATE VIEW</span>
视图返回a和b列的值加上c的值乘以 4。
1
2
3
4
5
6
7
test=# select * from v1;
a | b | ?column?
---+---+----------
1 | 2 | 12
4 | 5 | 24
7 | 8 | 36
(3 rows)
通过使用 WHERE 子句,我可以像使用表一样使用此视图。
1
2
3
4
test=# select * from v1 where a > 6;
a | b | ?column?
---+---+----------
7 | 8 | 36
物化视图
物化视图是数据的静态快照,其中两个关键字是“静态”和“快照”。如果您不希望许多用户频繁地请求相同的数据,那么您可以使用物化视图作为缓存。您可能熟悉仅每五分钟左右显示一次更新值的股票报价服务。这可以减轻数据库实例的主要负载,因为它处理基表中的请求。
1
2
3
4
5
6
7
test=# create materialized view v2 as SELECT a, b, c*4 from base;
SELECT 3
test=# select * from v2 where a > 6;
a | b | ?column?
---+---+----------
7 | 8 | 36
(1 row)
关键字 MATERIALIZED 被添加到视图定义中。在上面的例子中,物化视图使用了与之前的非物化视图相同的逻辑。这会缓存这些值以供以后使用。
但小心点。此物化视图是特定时间点的快照。为什么要小心?考虑以下我们更新表中的值的情况。
1
2
3
4
5
6
7
test=# update base set b=99 where a = 7;
UPDATE 1
test=# select * from v2 where a > 6;
a | b | ?column?
---+---+----------
7 | 8 | 36
(1 row)
b 的值在基表中更新,但物化视图值未更新。
但是使用 REFRESH 关键字很容易“更新”物化视图。
1
2
3
4
5
6
7
test=# refresh materialized view v2;
REFRESH MATERIALIZED VIEW
test=# select * from v2 where a > 6;
a | b | ?column?
---+----+----------
7 | 99 | 36
(1 row)
物化视图是缓存答案的好方法,但您必须注意数据可能已过时。
今天需要 MySQL 的物化视图吗?
MySQL 和 MariaDB 没有物化视图。您可以向这些供应商提出功能请求,表达您对该功能的渴望,但您不会在下一个版本中看到实现的物化视图。
另一个选择是EdgeDB,它具有物化视图以及与 MySQL 和 MariaDB 兼容的列式存储引擎。这建立在 Justin Swanhart 之前在物化视图和 WARP 存储引擎领域的工作的基础上。
概括
现在您知道物化视图是如何工作的,以及它们与常规视图有何不同。
可以在此处找到 PostgreSQL for MySQL 数据库管理员 (DBA) 过去的视频:第一集、 第二集、第三集、第四集、第五集、第六集和第七集。
原文标题:PostgreSQL for MySQL DBAs Episode 8: Materialized Views
原文作者: David Stokes
原文地址:https://www.percona.com/blog/postgresql-for-mysql-dbas-episode-8-materialized-views/




