-
MERGE算法:视图使用这种算法时,如果我们调用了视图,mysql会先将视图的定义转换成sql语句,然后把视图的sql语句与我们调用的语句整合,最后执行整合完毕的sql语句,什么意思呢,就以上图中的创建视图的sql语句为例,如果我们想要查看视图testvi中的所有数据,我们有可能会执行select * from testvi这条sql语句 ,如果testvi使用的是merge算法,那么mysql会先将执行的语句变成 select * from (select name,age from students;) ,然后执行最终改变过的语句,这就是merge算法对视图的处理过程,如果使用这种算法,即使定义视图时的sql语句不包含子查询,在我们调用视图的时候,最终执行的sql语句本身就一定包含子查询,而mysql对子查询的优化是不够的,当数据量大时,往往会影响性能,这就是不使用视图的理由。
-
TEMPTABLE算法:视图的结果将被置于临时表中,然后使用它执行语句,什么意思呢,还是以上图中的testvi视图为例,如果把上图中的merge改成temptable,当我们执行 select * from testvi时,mysql会先查询到会先将select name,age from students;的查询结果放置到临时表中,然后用户的语句再调用临时表中的数据,当视图使用这种算法时,视图只能用于查询,不能用于更新数据。
-
UNDEFINED:当algorithm设置为此值时,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。