MySQL View Processing Algorithms

摘要:在本教程中,您将了解 MySQL 视图处理算法,包括MERGETEMPTABLEUNDEFINED

CREATE VIEWALTER VIEW语句有一个可选子句: ALGORITHM 。该算法确定 MySQL 如何处理视图,并且可以采用三个值MERGETEMPTABLEUNDEFINE之一。

以下是带有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 (*) 转换为列表列名称customerNamefirstNamelastNamephone ,对应于customerNamecontactFirstNamecontactLastNamephone
  • 添加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 选择MERGETEMPTABLE 。如果可能的话,MySQL 更喜欢MERGE而不是TEMPTABLE ,因为MERGE通常比TEMPTABLE更高效。

在本教程中,您了解了 MySQL 视图处理算法,包括MERGETEMPTABLEUNDEFINED

本教程有帮助吗?