2016 - 2024

感恩一路有你

mysql left join mysqlleftjoin会影响数据库性能吗?

浏览量:3082 时间:2021-03-17 21:14:18 作者:admin

mysqlleftjoin会影响数据库性能吗?

只要索引使用得当,简单的left join是不会影响数据库查询性能的,但有几种情况要特殊考虑下:

1. 联表查询涉及到的表超过了3个,最好不要使用join,这是《阿里巴巴Java开发规范》明确说明的。

2. 涉及到分库分表的,也要慎用join(多表join一时爽,垂直拆分火葬场)


在平时的开发中,我一般的做法是能不用join就不用join,能使用Redis和本地缓存的就使用Redis和本地缓存,尽量避免因复杂的SQL运算造成数据库查询性能降低的操作。

left join效率为什么低?

为什么子查询比连接查询(LEFT JOIN)效率低

MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然很灵活,但是执行效率并不高。

那么问题来了,什么是子查询?为什么它的效率不高?

子查询:把内层查询结果当作外层查询的比较条件


示例:

select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods)

执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。


优化方式:

可以使用连接查询(JOIN)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快。

mysql一张大表,一张小表,如何join最快?

rows代表这个步骤相对上一步结果的每一行需要扫描的行数,可以看到这个sql需要扫描的行数为35773*8134,非常大的一个数字。本来c和h表的记录条数分别为40000 和10000 ,这几乎是两个表做笛卡尔积的开销了(select * from c,h)。

于是我上网查了下MySQL实现join的原理,原来MySQL内部采用了一种叫做 nested loop join的算法。Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复,基本上MySQL采用的是最容易理解的算法来实现join。所以驱动表的选择非常重要,驱动表的数据小可以显著降低扫描的行数。

mysql left join mysql默认join是什么 mysql为什么不用视图

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。