摘要:在本教程中,您将了解 MySQL 视图处理算法,包括MERGE
、 TEMPTABLE
和UNDEFINED
。
CREATE VIEW
和ALTER VIEW
语句有一个可选子句: ALGORITHM
。该算法确定 MySQL 如何处理视图,并且可以采用三个值MERGE
、 TEMPTABLE
和UNDEFINE
之一。
以下是带有ALGORITHM
子句的CREATE VIEW
语句:
CREATE [OR REPLACE][ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}] VIEW
view_name[(column_list)]
AS
select-statement;
Code language: SQL (Structured Query Language) (sql)
这是带有ALGORITHM
子句的ALTER VIEW
语句:
CREATE [ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}] VIEW
view_name[(column_list)]
AS
select-statement;
Code language: SQL (Structured Query Language) (sql)
MERGE
当您从MERGE
视图查询时,MySQL 处理以下步骤:
- 首先,将输入查询与视图定义中的
SELECT
语句合并为单个查询。 - 然后执行组合查询返回结果集。
请注意,将输入查询和视图定义的SELECT
语句组合成单个查询称为视图解析。
从示例数据库中查看以下customers
:
以下语句使用MERGE
算法基于customers
表创建一个名为contactPersons
的视图:
CREATE ALGORITHM=MERGE VIEW contactPersons(
customerName,
firstName,
lastName,
phone
) AS
SELECT
customerName,
contactFirstName,
contactLastName,
phone
FROM customers;
Code language: SQL (Structured Query Language) (sql)
假设您发出以下语句:
SELECT * FROM contactPersons
WHERE customerName LIKE '%Co%';
Code language: SQL (Structured Query Language) (sql)
MySQL 执行以下步骤:
- 将视图名称
contactPersons
转换为表名称customers
。 - 将 Askterisk (*) 转换为列表列名称
customerName
、firstName
、lastName
、phone
,对应于customerName
、contactFirstName
、contactLastName
、phone
。 - 添加
WHERE
子句。
结果语句是:
SELECT
customerName,
contactFirstName,
contactLastName,
phone
FROM
customers
WHERE
customerName LIKE '%Co%';
Code language: SQL (Structured Query Language) (sql)
TEMPTABLE
当您向TEMPTABLE
视图发出查询时,MySQL 执行以下步骤:
- 首先,创建一个临时表来存储视图定义中
SELECT
的结果。 - 然后,对临时表执行输入查询。
由于MySQL必须创建临时表来存储结果集并将数据从基表移动到临时表,因此TEMPTABLE
算法的效率低于MERGE
算法。
请注意, TEMPTABLE
视图不能更新。
UNDEFINED
当您创建视图而不指定ALGORITHM
子句或显式指定ALGORITHM=UNDEFINED
时, UNDEFINED
是默认算法。
另外,当您使用ALGORITHM = MERGE
创建视图并且 MySQL 只能处理带有临时表的视图时,MySQL 会自动将算法设置为UNDEFINED
并生成警告。
UNDEFINED
允许 MySQL 选择MERGE
或TEMPTABLE
。如果可能的话,MySQL 更喜欢MERGE
而不是TEMPTABLE
,因为MERGE
通常比TEMPTABLE
更高效。
在本教程中,您了解了 MySQL 视图处理算法,包括MERGE
、 TEMPTABLE
和UNDEFINED
。