MySQL 表与视图

最后更新: 2021-09-09 08:09:41 +0800 +0800
tags: Mysql | Sql | Databases
原文以英文撰写。您正在阅读AI翻译版本。

基表持久化存储行。视图持久化存储查询定义,并将其结果呈现为类似表的对象。SHOW FULL TABLES 可区分二者,而 INFORMATION_SCHEMA.TABLES.TABLE_TYPE 会报告 BASE TABLE 或 VIEW。

InnoDB 行格式 #

InnoDB 支持 REDUNDANT、COMPACT、DYNAMIC 和 COMPRESSED 行格式。 DYNAMIC 是当前的默认格式。对于可变长度列,InnoDB 可以将较长的值存储在溢出页中, 并在聚簇记录中保留一个引用。具体的行内和溢出存储行为取决于行格式、页大小、列类型和值长度; 设计模式时不应假定 TEXT 或 BLOB 值在行内占用固定大小。

检查表的实际配置:

sql
SHOW TABLE STATUS LIKE 'orders';
SHOW CREATE TABLE orders;

视图 #

使用稳定且明确的列列表创建视图:

sql
CREATE VIEW active_customer_orders AS
SELECT o.id, o.customer_id, o.created_at, o.total
FROM orders AS o
WHERE o.status = 'active';

默认情况下,视图不会存储单独的表。优化器可以将可合并视图并入外层查询;当定义要求时, 例如涉及聚合、DISTINCT 或某些派生表操作时,也可以将其物化为临时表。 ALGORITHM = MERGE 和 ALGORITHM = TEMPTABLE 表达一种偏好,但视图定义仍须满足所选算法的限制。

当每个受影响的行都能明确映射到一个基表时,部分视图可以更新。包含聚合、GROUP BY、 DISTINCT、窗口函数、集合操作或不可更新连接的视图不可更新。当视图的更新行为不属于所需接口时, 应使用基表执行写入。

DEFINER 账户和 SQL SECURITY 设置决定执行视图时应用谁的权限。 当视图向应用程序账户公开受限的投影时,应检查这两项设置。

WITH CHECK OPTION 可防止通过可更新视图进行的写入创建该视图无法看到的行。 CASCADED 检查当前视图和底层视图的条件,而 LOCAL 仅检查当前视图的条件:

sql
CREATE SQL SECURITY INVOKER VIEW active_customer_orders AS
SELECT id, customer_id, created_at, total, status
FROM orders
WHERE status = 'active'
WITH CASCADED CHECK OPTION;

MySQL 将视图定义存储在数据字典中,并在执行视图时解析引用的对象,但模式变更仍可能使视图失效。 更改依赖表后,应使用 SHOW CREATE VIEW 和 CHECK TABLE,并合理安排迁移顺序, 确保调用方始终不会看到不兼容的定义。

MySQL 没有原生且自动维护的物化视图对象。需要预计算时,应使用由定时事务、变更数据管道或应用程序作业填充的基表。 应明确规定刷新的原子性和数据新鲜度;与查询普通视图相比,交换或更新该表具有不同的一致性和元数据锁定行为。

参考资料 #

评论

在 GitHub 上阅读或评论(发表评论需要登录)