暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL for MySQL DBA 第 8 集:物化视图

原创 Ellison 2022-08-01
1507

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>


视图返回ab列的值加上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/

最后修改时间:2022-08-01 18:36:10
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论