mysql并行查询语句
简介: 在刚刚结束的乌镇世界互联网大会上,阿里云自研POLARDB云原生数据库当选世界互联网领先科技成果。POLARDB既融合了商业数据库稳定可靠、高性能、可扩展的特征,又具有开源云数据库简单开放、自...
2024.11.15在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么mysql内部是如何执行关联查询的呢?它又做了哪些优化呢?今天我们就来揭开mysql关联查询的神秘面纱。
二、mysql如何执行关联查询mysql关联执行的策略很简单:mysql对任何关联都执行嵌套循环关联操作。即:mysql先在一个表中循环取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。如果mysql在最后一个关联表无法找到更多的行,它将返回上一层关联表,看看能否找到更多的匹配记录,以此类推迭代执行。
按照这种方式,mysql查找第一个表的记录,再嵌套查询下一个关联表,然后回溯到上一个表,这正如其名——“嵌套循环关联”。看一下下面的例子:
select t1.column1, t2.column2 FROM tb1 t1 INNER JOIN tb2 t2 ON t1.column3 = t2.column3 WHERE t1.column1 IN (4, 6)假设mysql按照查询中的表顺序进行关联操作,我们可以用伪代码表示其过程:
outer_iter = iterator over t1 WHERE column3 IN (4, 6)outer_row = outer_iter.next WHILE outer_row inner_iter = iterator over t2 WHERE column3 = outer_row.column3 inner_row = inner_iter.next WHILE inner_row output [ outer_row.column1,inner_row.column2 ] inner_row = inner_iter.next END outer_row = outer_iter.next END上面的执行过程对于单表查询和多表关联查询都适用,如果只是单表查询,那么只需要完成最外层的循环操作即可。如果关联中存在外连接,上面的过程仍然适用,我们只需略作修改。查询sql如下:
select t1.column1, t2.column2 FROM tb1 t1 LEFT OUTER JOIN tb2 t2 ON t1.column3 = t2.column3 WHERE t1.column1 IN (4, 6)对应的伪代码修改如下:
outer_iter = iterator over t1 WHERE column3 IN (4, 6)outer_row = outer_iter.next WHILE outer_row inner_iter = iterator over t2 WHERE column3 = outer_row.column3 inner_row = inner_iter.next IF inner_row WHILE inner_row output [ outer_row.column1,inner_row.column2 ] inner_row = inner_iter.next END ELSE output [ outer_row.column1,NULL ] END outer_row = outer_iter.next END如果用图表示关联查询的过程,图示如下,请从左至右,从上至下看这幅图:
t1t2结果行column1=4,column3=1column3=1,column2=1column1=4,column3=1column3=1,column2=2column1=4,column3=2column3=1,column2=3column1=4,column3=3column1=6,column3=2column3=2,column2=1column1=6,column3=1column3=2,column2=2column1=6,column3=2column3=2,column2=3column1=6,column3=3mysql的关联方式也可以由一棵树表示,它是一个左侧深度优先树:
三、关联查询优化器
mysql优化器最重要的一部分就是关联查询优化,它决定了多个表关联时的顺序。通常多表关联的时候,可以有多种不同的关联顺序来获得相同的结果。关联查询优化器则通过评估不同顺序时的成本来选择一个代价最小的关联顺序。
大家看一下下面的查询,它可以通过不同的关联顺序得到相同的结果:
select u.realname, u.mobile, c.`name` FROM USER u INNER JOIN user_company uc ON u.id = uc.user_id INNER JOIN company c ON uc.company_id = c.id按照上面的关联执行规则,我们可以给出执行计划,mysql可以从user表开始,通过user_company表的user_id列找到对应的company_id,然后再通过company表的主键找到对应的记录。我们执行了mysql的explain,得出的结果如下:
这和我们给出的执行顺序不一致,这样的效率是否更高呢?我们使用STRAIGHT_JOIN关键字得出的分析结果如下:
我们分析一下mysql为什么会改变关联的顺序,我们可以看到改变顺序后,第一个关联表只需要扫描很少的行数,第二个、第三个关联表的扫描项也是不同的。uc表只有480条记录,而u表有2300条记录。如果先扫描uc表,只返回480条记录,然后进行嵌套循环查询,如果先扫描u表,则返回2300条记录。换句话说,更改顺序后,查询可以进行更少的嵌套循环和回溯操作。
通过这个例子,我们可以看到mysql是如何选择合适的顺序让查询执行的成本更低的。重新定义关联顺序是优化器的一个重要的功能,它尝试在所有关联顺序中选择一个成本最小的来生成执行计划树。
至此,mysql是如何进行关联查询的,以及优化,已经介绍完了,欢迎大家多多交流。
简介: 在刚刚结束的乌镇世界互联网大会上,阿里云自研POLARDB云原生数据库当选世界互联网领先科技成果。POLARDB既融合了商业数据库稳定可靠、高性能、可扩展的特征,又具有开源云数据库简单开放、自...
2024.11.151、为什么要进行数据库优化?1、避免网站页面出现访问错误由于数据库连接timeout产生页面5xx错误由于慢查询造成页面无法加载由于阻塞造成数据无法提交2、增加数据库的稳定性很多数据库问题都是由于低效...
2024.11.15mysql分页查询是先查询出来所有数据,然后跳过offset,取limit条记录,造成了越往后的页数,查询时间越长一般优化思路是转换offset,让offset尽可能的小,最好能每次查询都是第一页,也...
2024.11.13一、关联查询1、概念在查询数据时,所需要的数据不只在一张表中,可能在两张或多张表中。这个时候,需要同时操作这些表来查询数据,即关联查询。关联查询所涉及到的表与表之间都会存在有关联的字段,如员工表的部门...
2024.11.12对于B端系统,因为其业务复杂性而导致的SQL复杂性往往不太引起重视,觉得并发少,也就是个别功能慢影响用户体验而已,但是慢SQL不进行及时治理,会引发量变到质变,春节前,就有两个兄弟团队的系统,因为慢S...
2024.11.15