这篇文章将为大家详细讲解有关MySQL怎么联合查询优化机制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
MySQL联合查询执行策略。
以一个工会查询为例,MySQL执行工会查询时,会把他们当做一系列的单个查询语句,然后把对应的结果放入到临时表中,最终再读出来返回。在MySQL中,每个独立的查询都是一个联合查询,从临时表读取返回结果也一样。
这种情形下,MySQL的联合查询执行很简单,它将这里的联合查询当做是嵌套循环的联合查询。这意味着MySQL会运行一个循环去从数据表读取数据行,然而在运行一个嵌套循环从下一个表读取匹配的数据行。这个过程一直持续,直到找到联合查询中的所有匹配的数据行。然后再根据选择语句中需要的列去构建返回结果。如下面的查询语句所示:
SELECT tb1.col1, tb2.col2 得到tb1 INNER  JOIN tb2 使用(col3) WHERE tb1.col1 (5、6),
实际转换为MySQL可能执行的伪代码是下面这样的:
outer_iter =, iterator 配套;tb1 WHERE col1 在(5、6); 时间=outer_row outer_iter.next; while outer_row 时间=inner_iter iterator 配套;tb2 where col3 =, outer_row.col3; inner_row =inner_iter.next ,,,while inner_row ,,,,(outer_row.col1 output ,, inner_row.col2]; ,,,,,,,inner_row =, inner_iter.next; 结束 ,,,outer_row =, outer.iter.next;
结束转换为伪代码后如下所示
outer_iter =, iterator 配套;tb1 where col1 在(5、6); 时间=outer_row outer_iter.next; while outer_row 时间=inner_iter iterator 配套;tb2 where col3 =, outer_row.col3; inner_row =inner_iter.next ,,,if inner_row ,,,,,,,while inner_row ,,,,,,,,,,,output [outer_row.col1, inner_row.col2); ,,,,,,,,,,,inner_row =, inner_iter.next; ,,,,,,,结束 ,,, ,,,,output (outer_row.col1, NULL); 结束 ,,,outer_row =, outer.iter.next;
结束另一个方式可视化展现查询计划的方式是使用泳道图的形式。下面的图展示了内连接查询的泳道图。
MySQL执行的各类查询基本上都是相同的方式,例如,在从条件里需要先执行的子查询时,也是先将结果放入临时表,然后再把临时表当作普通表后联合来处理.MySQL执行联合查询时也是使用临时表,然后将右连接查询重写为等价的左连接。简而言之,当前版本的MySQL会尽可能把各类查询转成这种方式处理(最新版本MySQL5.6以后引入了更多的复杂的处理方式)。
当然,并不是所有合法的SQL查询语句都可以这么做,有些查询这么做的效果可能很差。
执行计划
MySQL不像其他很多数据库产品,它不会将查询语句产生字节码去执行查询计划。实际上,查询执行计划是一棵指令树,查询执行引擎根据这棵树产生查询结果。最终的查询计划包含了足够多的信息去重构最初的查询。如果在查询语句上执行解释扩展(MySQL 8以后不需要加扩展),然后再执行显示警告,就可以看到重构后的查询。
对于多表查询在概念上可以用树代表,例如,一个4张表的查询可能长得像下面的树一样。这在计算机里称为平衡树,
然而这不是MySQL执行查询的方式。如前所述,MySQL总是从一张数据表开始,然后再从下一张表寻找匹配的数据行。因此,MySQL的查询计划看起来像下面的左深连接树。
联合查询优化器
MySQL的查询优化器中最重要的部分是联合查询优化器,由它来决定多表查询执行过程的最优顺序。通常可以通过多种联合查询的次序获取相同的结果。联合查询优化器试图估计这些方案的代价,然后选择最低代价的方案去执行。
下面是一个查询相同结果,但不同次序的联合查询示例。
SELECT film.film_id,, film.title,, film.release_year,, actor.actor_id,, actor.first_name, actor.last_name 得到sakila.film INNER JOIN  sakila.film_actor 使用(film_id) INNER JOIN  sakila.actor 使用(actor_id);MySQL怎么联合查询优化机制