首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

技术分享 | 详解 MySQL JOIN

常听说 MySQL 中三 JOIN 的执行流程并不是前两张 JOIN 得出结果,再与第三张进行 JOIN;而是三嵌套的循环连接。 那这个三嵌套的循环连接具体又是个什么流程呢?...与前两张 JOIN 得出结果再与第三张进行 JOIN 的执行效率相比如何呢?下面通过一个例子来分析分析。 1前提 关联字段无索引的情况下强制使用索引嵌套循环连接算法,目的是更好地观察扫描行数。...3通过执行成本分析 JOIN 过程 查看执行计划成本: mysql> explain format=json select * from t1 join t2 on t1.b=t2.b join t3...通常建议 JOIN 不超过两张,就是因为优化器估算成本误差大导致选择不好的执行计划,如果要用,一定要记住:关联字段必须要有索引,最好是唯一性或者基数大的索引。...补充:MySQL 8.0 有 HASH JOIN 后这种情况会好很多。 本文关键字:#MySQL# #JOIN#

98710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SQL联细节,MySQL JOIN 的执行过程

    问题背景   对于 MySQLJOIN,不知道大家有没有去想过他的执行流程,亦或有没有怀疑过自己的理解(自信满满的自我认为!)...;如果大家不知道怎么检验,可以试着回答如下的问题   驱动的选择     MySQL 会如何选择驱动,按从左至右的顺序选择第一个?   ...正经图1 摘自 Mysql - JOIN详解     看完这个,楼主第一时间有发现新大陆的感觉,原来 JOIN 的执行顺序是这样的(不是颠覆了楼主之前的认知,因为楼主之前就没想过这个问题,而是有种新技能获取的满足...如果两各有几百上千万的数据,那这两张做笛卡尔积,结果不敢想象!...SQL 执行路径,摘自《高性能MySQL》     可以看到,执行计划是查询优化器的输出结果,执行引擎根据执行计划来查询数据   数据准备     MySQL 5.7.1,InnoDB 引擎;建 SQL

    5.2K10

    mysql join

    首先先放张图 今天聊聊mysqljoin连接,其本质是拿主表每条数据取出来和子表每行数据进行循环比较,如果满足则返回,不满足返回null 首先是内连接 两者之间取交集,两边都满足返回,不满足不返回...JOIN 然后是左外连接 左外连接,此时可以理解为理解 左为主表,右为子表。...在条件不满足时,左数据存在,右数据为null 简单来说就是结果集包含左所有行,右不匹配则为null SELECT * FROM sp_user a LEFT OUTER JOIN tb_seller...sp_user b ON a.seller_id = b.seller_id WHERE b.seller_id IS NULL 还有一种是全外连接 全外连接是内联结果和不满足条件的行 mysql...UNION SELECT * FROM sp_user a RIGHT OUTER JOIN tb_seller b ON FALSE 另外,阿里开发规范表示 【强制】超过三个禁止 join

    60010

    Mysql - join 优化

    MMR 解决的不是 join 优化,而是回优化:   mutil-range read , 正如他的名字一样,优化的是离散范围的读,具体是优化在 主键上离散范围的读   如果是从辅助索引读取符合条件的...离散读取主键索引的情况   MMR 做的事情是 把得到的 主键先放在 read_rnd_buffer ,然后排序,然后再去主键索引读取 数据行,这样的话就能减少离散读 BKA 依赖于 MMR 进行 join...join)情况下用不上的 join buffer,每读一行驱动,就将连接字段放入 join buffer   然后将 join buffer 传给 MMR ,MMR 负责 去连接字段对应的被驱动的辅助索引上读取主键...,并且放到 read_rnd_buffer ,然后排序,再去被驱动的主键索引读取行数据 大 join 对内存的影响:   如果被驱动是 大,驱动也比较大,能被分成几个 join buffer,...用临时作为被驱动

    65720

    Mysqljoin

    介绍 MySQL 中的join可以分为如下三类: INNER JOIN(内连接,或等值连接):获取两个中字段匹配关系的记录。...LEFT JOIN(左连接):获取左所有记录,即使右没有对应匹配的记录。 RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右所有记录,即使左没有对应匹配的记录。...内连接 对上述两张进行内连接,连接条件为name字段相等....会返回在两张中都存在的数据. mysql> select * from student join student_grade on student.name = student_grade.name...> 笛卡尔积在一些场景中有应用,比如:A表示所有学生的记录,B是所有课程的记录,那么AB两张的笛卡尔积可以表示所有可能的选课情况. 2.左外连接 对上述两张进行左外连接,连接条件为name相等.可以看到

    62540

    mysql left join、right join、inner join用法分析

    四种联接 left join(左联接) 返回包括左中的所有记录和右中联结字段相等的记录 right join(右联接) 返回包括右中的所有记录和左中联结字段相等的记录 inner join...(等值联接) 只返回两个中联结字段相等的行 cross join(交叉联接) 得到的结果是两个的乘积,即笛卡尔积 创建 CREATE TABLE `product` (`id` int...跟left join相反,不多做解释,MySQL本身不支持所说的full join(全连接),但可以通过union来实现。...(交叉联接) cross join:交叉联接,得到的结果是两个的乘积,即笛卡尔积。...A Left join B On a.id=b.idAnd b.id=2;从B中检索符合的所有数据行,如果没有匹配的全部为null A Left join B On a.id=b.idWhere

    3K70

    mysqljoin

    前言: 了不起学弟:学长啊,我最近在学习mysql,对于这个join,我也有了自己的一些看法,这个join就差不多就是把两张连接在一起对吧!...了不起:嗯,差不多就这个意思,你把两张连接在一起是在一起,你还缺少一个最终要的on条件。如果没这个条件可不行,那就是union all一样,单纯的把两张拼接在一起了。...说完inner join,我们再讲一下 left join吧。left join 和inner join 其实是很相似的。inner join 就是取两张的交集。...而left join,就是包含了相交的地方,和左的地方,按照刚刚的例子也就是说,包含了所有的圈A。 举个刚才的例子,假设刚刚的订单和产品。...如果我们left join,那我们得到的结果就是订单的所有的记录,如果你是select * ,那条不在产品表记录的数据,后边B标的数据就是为空。

    13610

    Mysql - join 原理

    A left join B , B right join A on A.x = B.y   假设 A 100 行, B 1000 行 A 是驱动,B是被驱动 1.被驱动上有索引的情况:(B.y...  具体只用 100 * k * log (1000) 次的磁盘读,k是不定常数 2.被驱动上无索引的情况   需要额外内存,被称为 join buffer   join buffer 被放入驱动...  把符合条件的驱动的行 和 从磁盘中读出来的被驱动的行 放入结果集   具体要比较 100 * 1000 次,但是是内存操作   磁盘读需要 100 + 1000 次 3.如果驱动太大,join...buffer 容不下,那么就要把 驱动分批次读入内存 因为只有被读入的部分可以被 被驱动比较,并且被比较的部分是被 整个被驱动 比较 所以,如果驱动被分成 K 份,就需要读取 被驱动...K 次 总共需要磁盘 读取次数 = 驱动行数 + 被驱动行数 * (驱动总大小 / join buffer大小)

    76230

    MySQL Join工作原理

    select * from t1 straight_join t2 on t1.a=t2.a; 这里使用straight_join,如果我们直接使用joinMySQL优化器可能选t1或t2作为驱动...,但是使用straight_join,会强制t1作为驱动,t2是被驱动。...Block Nested-Loop Join Index Nested-Loop Join是在被驱动有索引的情况下,如果被驱动上没有可用的索引,算法的流程如下: 将t1的数据读入线程内存join_buffer...如果可以使用Index Nested-Loop Join算法(用上被驱动上的索引)其实没有问题 如果使用Block Nested-Loop Join算法,尽量不要对大进行join,这样可能会导致扫描行数过多...,占用大量系统资源 在join的时候尽量选择小做驱动 在判断哪个是小的时候应该是按照两个各自的条件过滤,过滤完成以后,计算参与join的各个字段的总数据量,数据量小的那个就是小

    43120
    领券