后面也会持续更新,学到新东西会在其中补充。
建议按顺序食用,欢迎批评或者交流!
缺什么东西欢迎评论!我都会及时修改的!
感谢各位大佬写的文章让我学到很多东西!只是在各位大佬的基础加了我自己的思路!
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.m2
、t1.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