MySQL怎么联合查询优化机制

  介绍

这篇文章将为大家详细讲解有关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执行联合查询时也是使用临时表,然后将右连接查询重写为等价的左连接。简而言之,当前版本的MySQL会尽可能把各类查询转成这种方式处理(最新版本MySQL5.6以后引入了更多的复杂的处理方式)。

当然,并不是所有合法的SQL查询语句都可以这么做,有些查询这么做的效果可能很差。

执行计划

MySQL不像其他很多数据库产品,它不会将查询语句产生字节码去执行查询计划。实际上,查询执行计划是一棵指令树,查询执行引擎根据这棵树产生查询结果。最终的查询计划包含了足够多的信息去重构最初的查询。如果在查询语句上执行解释扩展(MySQL 8以后不需要加扩展),然后再执行显示警告,就可以看到重构后的查询。

 MySQL怎么联合查询优化机制

对于多表查询在概念上可以用树代表,例如,一个4张表的查询可能长得像下面的树一样。这在计算机里称为平衡树,

然而这不是MySQL执行查询的方式。如前所述,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怎么联合查询优化机制