MySQL视图处理算法
简介:在本教程中,您将学习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。