mysql两张大表join优化,MySQL系列6 - join语句的优化
当被驱动表是一张非常大的冷表,且没有命中索引时。我们该如何做优化呢?
表t2的c2字段是没有索引的,且t2表是一张超级大的冷表,join语句如下:
select * from t1 straight_join t2 on (t1.c1=t2.c2);
其执行过程如下图:
图片
其中对t2表做多次全表扫描会带来什么问题呢?
innoDB存储引擎中有一片区域称为Buffer Pool,用来做查询缓存的。其使用的算法为LRU算法::第一次从磁盘读入内存的数据页,会先放在 old 区域。如果 1 秒之后这个数据页不再被访问了,就不会被移动到 LRU 链表头部。
但是由于t2表数据量比较大,每一次全表扫描t2表必然超过来1秒,那么再次全表扫描t2表时,冷表的数据页移到 LRU 链表头部。这样带来的后果是正常的业务查询数据无法进入链表头部。导致join语句开始执行到执行完成后的一定时间内链表头部的数据页没有被合理地淘汰。
所以,这种情况不仅这条语句本身执行效率慢,且同时影响了正常业务查询的效率。而且对正常业务查询的影响还是持续性的,得依靠后续的查询逻辑恢复Buffer Pool。
这种情况有两种优化方式:
增加join_buffer_size,减少t2表全表扫描的次数。
把t1表需要查询的字段读入内存临时表中。(起到一个大的join_buffer的作用)对应的执行语句如下:
// 创建临时表
create temporary table temp_t1(
id int primary key,
c1 int,
c2 int,
index(c1)
)engine=innodb;
// 插入t1数据
insert into temp_t1 select * from t1;
//使用临时表做join查询
select * from temp_t1 join t2 on (t2.c2=temp_t1.c1);
join查询时,条件是放在on里还是where里?
如下两条语句,你会做如何选择呢?
// sql1
select * from t1 left join t2 on t1.c1=t2.c1 where t2.c2>100;
//sql2
select * from t1 left join t2 on t1.c1=t2.c1 and t2.c2>100;
我们来看下sql1、sql2的执行过程:
图片
t1表读取一行L,到t2表根据on条件到t2表查找一行数据R(找不到填充null)
L与R的结果存放到临时结果集
读取t1表下一行
重复1、2、3步,直到t1表扫描完成
在临时结果集中根据where条件过滤得到结果集
sql1和sql2区别在于第五步,where条件的执行在on条件查询的结果后,所以尽量把可能多的条件放在on后,减少where的执行。
本作品采用《CC 协议》,转载必须注明作者和本文链接
mysql两张大表join优化,MySQL系列6 - join语句的优化相关推荐
- mysql 两张大表关联_MySQL的DropTable影响分析和最佳实践
[0.前言] MySQL上直接Drop张大表,会有什么影响,能否直接写个 drop table ; 或者 truncate table ; 甚至是delete * from? 如果这张表足够大,比如1 ...
- mysql 两张大表关联_详解mysql生产环境如何快速有效的删除大表,附实验说明
概述 我们很多时候都会去drop一些大表,特别是生产环境做操作时,这里主要提一些注意事项,仅供参考. 01 相关语法 1.删表 DROP TABLE SyntaxDROP [TEMPORARY] TA ...
- MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)两个表使用条件从另外一个表获取数据更新本表
MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)两个表使用条件从另外一个表获取数据更新本表 有两张表,info1, info2 . info1: info2: 方式一:要用info2中的 ...
- 关于MYSQL两个表取差集
今天在做一个小功能的时候,遇到了需要取两个表的差集,本来可以直接通过两次查表然后通过代码去处理. 由于我个人比较喜欢减少数据库交互,所以在网上查了下关于mysql两个表取差集的方案.但是发现很多的 差 ...
- mysql两张表关联修改
mysql两张表关联修改 两张表的字段code是相同的,然后code作为关联参数来关联两表,将user2 中的name写入到user1 的name中,三表,四表,多表都是一个道理 UPDATE use ...
- mysql两个表left join_mysql中两张表使用left join on 求差集
1.表结构 mysql> select * from allStudents; +----+-------+ | id | name | +----+-------+ | 1 | ???? | ...
- mysql 两张表差集_mysql中两张表使用left join on 求差集详解
1.表结构 mysql> select * from allStudents; +----+-------+ | id | name | +----+-------+ | 1 | ???? | ...
- [MySQL优化案例]系列 — slave延迟很大优化方法
备注:插图来自网络搜索,如果觉得不当还请及时告知 :) 一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以In ...
- mysql 两张表合并查询_中级数据分析-多表查询
表的加法 表的联结 联结应用案例 case应用案例 一.表的加法 加法:union 表的加法是把两个表的数据,按行合并在一起. 表的加法,会把两个表里重复的数据删除,只保留一个. 如果想保留重复数据, ...
最新文章
- 【Python】pandas 缺失数据处理大全(附代码)
- HALCON示例程序measure_ring.hdev齿轮齿宽度测量
- nit计算机应用基础是考试大纲,NIT考试大纲--计算机应用基础.doc
- 前端学习(2345):uniapp学习
- java物理架构_Java应用架构读书笔记(1):物理设计与逻辑设计
- php mysql实现删除功能_这个PHP / MySQL删除功能是否安全?
- python函数案例名片管理器_python实现名片管理器的示例代码
- 马哥教育SRE笔记【作业】week02
- React之Protals详解
- 淘宝标题怎么写才能具有高权重
- android 解锁过程,Android-解锁与刷机(以一加为例)
- scrum立会报告+燃尽图(第二周第七次)
- 博客导航——一站式搜索(所有博客的汇总帖)【微信开发】
- 【Android】Vibrator的使用
- 武汉ACM集训——贪心-7
- Android nfc模块读写MifareClassic卡50
- 赠书福利丨我们人类与人工智能技术究竟是怎样的关系?
- App应用双开技术,Android沙盒
- Web技术(Java)初学+制作学期课程表
- 人要在自我否定中进步!
热门文章
- 题目:输入三个整数x,y,z,请把这三个数由小到大输出。
- Ubuntu 18.04安装后资源和问题汇总
- 国外酷站设计:10个漂亮的个人作品网站
- Linux运维之软件包管理
- 【自动微分原理】02. 自动微分的正反模式
- Oracle JDK和 OpenJDK 之间的区别
- 计算机软件ex,ex-系统爱好者
- 计算机毕业设计Java我饿了外卖平台(源码+系统+mysql数据库+Lw文档)
- html在小的电脑屏幕字体缩小,如何把电脑字体调小?教你怎么调整电脑屏幕的字体大小...
- GME语音服务基于浏览器解决方案