MySQL连接思维导图分为连接本质与连接方式
树图思维导图提供 MySQL连接 在线思维导图免费制作,点击“编辑”按钮,可对 MySQL连接 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:8700a1e7607a00dde9e9ce53f822a63b
MySQL连接思维导图模板大纲
连接:就是把各个表中的记录取出来依次匹配,并把匹配后的组合发送给客户端
笛卡尔积:连接查询的结果集包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合
步骤1:首先确定第一个需要查询的表,称为驱动表
步骤2:步骤1中从驱动表每获取一条记录,都需要到被驱动表中查找匹配的记录
外连接:即使匹配不到,仍需加入到结果集中
左外连接:选取左侧的表为驱动表
右外连接:选取右侧的表为驱动表
内连接:驱动表中的记录在北区东表中匹配不到,则该记录不会加入到最后的结果集中
语法:
内连接
JOIN、INNER JOIN、CROSS JOIN、select * from t1,t2
外连接
LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN
Index Nested Loop Join:可以用上被驱动表的索引。简称NLJ
Simple Nested Loop Join:被驱动表用不上索引。此时join会使用BLJ算法
Block Nested Loop Join:使用join buffer存放驱动表记录。简称BLJ
性能问题:1.可能多次扫描被驱动表,占用io。2.判断 join 条件需要执行 M*N 次对比(M、N 分别是两张表的行数),如果是大表就会占用非常多的 CPU 资源。3.可能会导致 Buffer Pool 的热数据被淘汰,影响内存命中率
BNL优化为BKA:1.某些情况下,直接在驱动表上创建索引,直接转成BKA算法。2.使用临时表(低频语句,不适合创建索引情况)
JOIN 优化:
MRR:多范围读取
核心:语句做范围查询的时候得到的多个主键值放入read_rnd_buffer进行排序,排序之后通过主键回表查数据,充分利用顺序读
稳定使用mrr:set optimizer_switch="mrr_cost_based=off"
BKA:NLJ算法的优化
核心:引入BLJ算法的join buffer,同时还使用到了被驱动表的索引
开启BKA:set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';(依赖MRR)
过滤条件思维导图模板大纲
where:无论内外连接,凡是不符合where条件的记录都不会加入最后的结果集(为了实现即使使用外连接,也可以不用把驱动表的记录全部加入结果集)
on:如果无法在被驱动表中找到匹配on过滤条件的记录,那么该记录也会加入到结果集,对应的被驱动表记录的各个字段用null表示
驱动表只需要访问一次,被驱动表可能访问多次(称为嵌套循环连接Nested-Loop Join)思维导图模板大纲
1.BKA 优化是 MySQL 已经内置支持的,建议你默认使用;2.BNL 算法效率低,建议你都尽量转成 BKA 算法。优化的方向就是给被驱动表的关联字段加上索引;3.基于临时表的改进方案,对于能够提前过滤出小数据的 join 语句来说,效果还是很好的;思维导图模板大纲
树图思维导图提供 语法填空纯空格 在线思维导图免费制作,点击“编辑”按钮,可对 语法填空纯空格 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:be024c6b3aa828baef5aec76137c1e7e
树图思维导图提供 细胞连接与细胞黏附 在线思维导图免费制作,点击“编辑”按钮,可对 细胞连接与细胞黏附 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:e3c1ef57f031a919f847ff99bde0f12b