基表持久化存储行。视图持久化存储查询定义,并将其结果呈现为类似表的对象。SHOW FULL TABLES
可区分二者,而 INFORMATION_SCHEMA.TABLES.TABLE_TYPE 会报告 BASE TABLE 或 VIEW。
InnoDB 行格式 #
InnoDB 支持 REDUNDANT、COMPACT、DYNAMIC 和 COMPRESSED 行格式。
DYNAMIC 是当前的默认格式。对于可变长度列,InnoDB 可以将较长的值存储在溢出页中,
并在聚簇记录中保留一个引用。具体的行内和溢出存储行为取决于行格式、页大小、列类型和值长度;
设计模式时不应假定 TEXT 或 BLOB 值在行内占用固定大小。
检查表的实际配置:
SHOW TABLE STATUS LIKE 'orders';
SHOW CREATE TABLE orders;视图 #
使用稳定且明确的列列表创建视图:
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 仅检查当前视图的条件:
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 上阅读或评论(发表评论需要登录)