MySQL(JOIN执行流程)

 后面也会持续更新,学到新东西会在其中补充。

建议按顺序食用,欢迎批评或者交流!

缺什么东西欢迎评论!我都会及时修改的!

感谢各位大佬写的文章让我学到很多东西!只是在各位大佬的基础加了我自己的思路!

MySQL表关联的几种常用方式 - S流星 - 博客园

MySQL :: MySQL 8.0 参考手册 :: 10.2.1.7 嵌套循环连接算法 --- MySQL :: MySQL 8.0 Reference Manual :: 10.2.1.7 Nested-Loop Join Algorithms MySQL :: MySQL 8.0 参考手册 :: 10.2.1.4 哈希连接优化 --- MySQL :: MySQL 8.0 Reference Manual :: 10.2.1.4 Hash Join Optimization

MySQL 的 Join 查询及 Hash Join 优化 | StoneDB 技术分享会 #3 - 个人文章 - SegmentFault 思否

技术分享 | Hash join in MySQL 8 - 个人文章 - SegmentFault 思否

mysql进阶优化篇04——深入JOIN语句的底层原理_mysql join的底层原理是什么-优快云博客

mysql8.0的hash join算法及其优化_mysql 没执行hash算法-优快云博客

神奇的 SQL 之 JOIN,以MySQL为例来探讨下它的执行过程是怎样的(下)mrr 能够将随机 IO 优化成 顺序 - 掘金

多范围读取优化 - MariaDB 知识库 --- Multi Range Read Optimization - MariaDB Knowledge Base


后面也会持续更新,学到新东西会在其中补充。

建议按顺序食用,欢迎批评或者交流!

缺什么东西欢迎评论!我都会及时修改的!

大部分截图和文章采用该书,谢谢这位大佬的文章,在这里真的很感谢让迷茫的我找到了很好的学习文章。我只是加上了自己的拙见我只是记录学习没有任何抄袭意思

MySQL 是怎样运行的:从根儿上理解 MySQL - 小孩子4919 - 掘金小册

开始前先解释一下,可能个人理解有误欢迎指正。我也是翻阅了大量资料得出的结论,还需要不断实验。 

Simple Nested-Loop

select * from t1,t2,t3;

伪代码

for each row in t1 matching range {
  for each row in t2 matching reference key {
    for each row in t3 {
      if row satisfies join conditions, send to client
    }
  }
}

说白了就是for循环但又不完全是for循环

开始前需要知道一个概念叫做笛卡尔积

create table A(id int,age int);

create table B(id int,name varchar(20));


insert into A values(1,22);
insert into A values(2,23);
insert into A values(3,24);
insert into B values(1,'x');
insert into B values(2,'y');
insert into B values(3,'z');


mysql> select * from A,B;
+------+------+------+------+
| id   | age  | id   | name |
+------+------+------+------+
|    3 |   24 |    1 | x    |
|    2 |   23 |    1 | x    |
|    1 |   22 |    1 | x    |
|    3 |   24 |    2 | y    |
|    2 |   23 |    2 | y    |
|    1 |   22 |    2 | y    |
|    3 |   24 |    3 | z    |
|    2 |   23 |    3 | z    |
|    1 |   22 |    3 | z    |
+------+------+------+------+
9 rows in set (0.00 sec)

假设我们两个集合,集合A={a},集合B={0, 1, 2},则A与B的笛卡尔积为{(a, 0), (a, 1), (a, 2)},表示为AxB。

有两张表,怎么扫呢?最简单的方式就是在驱动表A从第一行到最后一行在被驱动表B中查找(查B的所有行)对吧!找到了就结合放到结果集里。

按照这个逻辑走下来就是3 x 3 = 9 对吧!

那么读取记录数就是A的表行数加上A的表行数乘上B的表行数

读取记录 = A + A x B

因此A的作用很大能影响读取记录到底是多少!

问题来了!我们是数据很少啊!你看就3行若是10000行呢?当然需要优化对吧!

连接过程

连接查询中的过滤条件可以分成两种:

  • 涉及单表的条件

    这种只涉及单表的搜索条件,比如t1.m1 > 1是只针对t1表的过滤条件,t2.n2 < 'd'是只针对t2表的过滤条件。

  • 涉及两表的条件

    t1.m1 = t2.m2t1.n1 > t2.n2等,这些条件中涉及到了两个表

CREATE TABLE t1 (m1 int, n1 char(1));
CREATE TABLE t2 (m2 int, n2 char(1));

INSERT INTO t1 VALUES(1, 'a'), (2, 'b'), (3, 'c');
INSERT INTO t2 VALUES(2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值