MySQL视图处理算法

时间:2019-11-20 08:52:13  来源:igfitidea点击:

简介:在本教程中,您将学习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;

这是带有ALGORITHM子句的ALTER VIEW语句:

CREATE [ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}] VIEW 
   view_name[(column_list)] 
AS 
   select-statement;

合并

当您从MERGE视图查询时,MySQL处理以下步骤:

  • 首先,将输入查询与视图定义中的SELECT语句合并为一个查询。

  • 然后,执行组合查询以返回结果集。

请注意,将输入查询和视图定义的SELECT语句组合到单个查询中称为视图分辨率。

从示例数据库中查看以下客户:

下面的语句使用MERGE算法基于customers表创建一个名为contactPersons的视图:

CREATE ALGORITHM=MERGE VIEW contactPersons(
    customerName, 
    firstName, 
    lastName, 
    phone
) AS
SELECT 
    customerName, 
    contactFirstName, 
    contactLastName, 
    phone
FROM customers;

假设您发出以下语句:

SELECT * FROM contactPersons
WHERE customerName LIKE '%Co%';

MySQL执行以下步骤:

  • 将视图名称contactPersons转换为表名称客户。

  • 将askterisk(*)转换为名称为customerName,firstName,lastName,phone的列表列,该列对应于customerName,contactFirstName,contactLastName,phone。

  • 添加WHERE子句。

结果语句为:

SELECT 
    customerName, 
    contactFirstName, 
    contactLastName, 
    phone
FROM
    customers
WHERE
    customerName LIKE '%Co%';

临时表

当您向TEMPTABLE视图发出查询时,MySQL执行以下步骤:

  • 首先,创建一个临时表以将SELECT的结果存储在视图定义中。

  • 然后,对临时表执行输入查询。

由于MySQL必须创建临时表来存储结果集并将数据从基本表移至临时表,因此TEMPTABLE算法的效率低于MERGE算法。

请注意,TEMPTABLE视图不能更新。

未定义

创建视图而不指定ALGORITHM子句或显式指定ALGORITHM = UNDEFINED时,UNDEFINED是默认算法。

此外,当您使用ALGORITHM = MERGE创建视图时,MySQL仅可使用临时表处理该视图,MySQL会自动将该算法设置为UNDEFINED并生成警告。

TheUNDEFINED允许MySQL选择MERGE或TEMPTABLE。
MySQL如果可能的话,更喜欢MERGE而不是TEMPTABLE,因为MERGE通常比TEMPTABLE更高效。

在本教程中,您了解了MySQL视图处理算法,包括MERGE,TEMPTABLE和UNDEFINED。