mysql join buffer_MySQL cache之join buffer的优化
MySQL cache之join buffer的优化
mysql的连接(join)处理只有nest loop一种算法,基本原理是先取第一个表的行,然后再依次
扫描第二个表中的所有行进行匹配,一旦匹配成功则返回结果集.
在连接的过程有几个很重要的因素,比如cpu,连接栏位上是否有索引等等,本文将只讨论join buffer
的影响.join_buffer_size在mysql官方文档只说明了用于连接的buffer大小。在这里有几个问题没有交待清楚
1,join buffer究竟是存放的什么数据?
2,为什么不使用标准的cache,而对于join操作要单独设置一个buffer?
再来看nest loop的处理过程,由于第二个表可能需要访问多次,可能造成的一个后果就是第二个表对的cache
会非常热,从而形成热块,在多个线程执行连接同时去访问相应的的cache时,带来的影响越大.
使用了一个专用的join buffer来存放第二个表以后,至少可以解决以下问题:1,由于join buffer是存放的基于每
thread的连接表信息,这样在连接的时候,只需要访问join buffer就可以了,不需要再去有并发机制保护的cache.
2,join buffer的代码路径更短,执行访问速度更快.
例,创建两个表
t1(a int,b varchar(100),c varchar(100));
t2(a int,b varchar(100),c varchar(100));
分别insert数据
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 9999 |
+----------+
1 row in set (0.01 sec)
mysql> select count(*) from t2;
+----------+
| count(*) |
+----------+
| 99999 |
+----------+
1 row in set (0.04 sec)
更改join_buffer_size的大小,观察执行结果。
mysql> set session join_buffer_size=128;
Query OK, 0 rows affected (0.00 sec)
mysql> select STRAIGHT_JOIN count(t2.a) from t1,t2 where t1.a=t2.a;
+-------------+
| count(t2.a) |
+-------------+
| 9999 |
+-------------+
1 row in set (43.92 sec)
mysql> set session join_buffer_size=268435456;
Query OK, 0 rows affected (0.00 sec)
mysql> select STRAIGHT_JOIN count(t2.a) from t1,t2 where t1.a=t2.a;
+-------------+
| count(t2.a) |
+-------------+
| 9999 |
+-------------+
1 row in set (32.19 sec)
可以看到在更改过后,由于join_buffer_size更大了,执行速度会加快.
对于join_buffer_size的优化,由于是每个线程单独分配,因此需要根据最大连接数,机器可用内存来分配,防止内存用尽或OOM
一般4-8M是一个比较合理的值,对于复杂的连接sql,可以在连接开始前手动指定join_buffer_size大小.
mysql join buffer_MySQL cache之join buffer的优化相关推荐
- spark1.4加载mysql数据 创建Dataframe及join操作连接方法问题
首先我们使用新的API方法连接mysql加载数据 创建DF import org.apache.spark.sql.DataFrame import org.apache.spark.{SparkCo ...
- mysql的join算法_mysql的Join算法-阿里云开发者社区
实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 测试数据 CREATE TABLE `dept_emp` ( `emp_no` int(11) NOT NULL, `dept_no` char(4) N ...
- 如何在MySQL中进行FULL OUTER JOIN?
我想在MySQL中进行完全外部联接. 这可能吗? MySQL是否支持完全外部联接? #1楼 在SQLite中,您应该这样做: SELECT * FROM leftTable lt LEFT JOIN ...
- mysql的left join和inner join的效率对比,以及如何优化
一.前言 最近在写代码的时候,遇到了需要多表连接的一个问题,初始sql类似于: select * from a left join b on a.x = b.x left join c on c.y ...
- mysql sql left right inner join区别及效率比较
一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...
- mysql natural join用法_MySQL NATURAL JOIN
NATURAL JOIN 也叫自然连接,实际是属于 JOIN 的一种. MySQL NATURAL JOIN 语法如下: ... FROM table1 NATURAL JOIN table2 ... ...
- mysql不用left join_MySQL在右表数据不唯一的情况下使用left join的方法_MySQL - join
一.Join语法概述join 用于多表中字段之间的联系,语法如下:... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditionatable1:左表 ...
- mysql语法中的join_MySQL JOIN 语法说明与 图解
一.MySQL JOIN 分类 JOIN 按照功能大致分为如下三类: INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记 ...
- Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...
最新文章
- ASP.NET 定时执行任务(定时器)
- php轻量级的性能分析工具xhprof的安装使用
- sum和total的区别
- LeetCode 246. 中心对称数(哈希)
- python性能测试台_性能测试平台效率优化的一次经验(python版)
- ssis中数据类型_SSIS中的数据挖掘查询
- 英国莽汉司机认罪:放任特斯拉自动驾驶,自己躺在副驾悠哉悠哉
- [翻译] TLMotionEffect 重力感应
- 2020公务员考试应届毕业生的身份界定
- CAD计算机辅助设计——文件管理和界面设置
- 【解局】瑞幸向上,盒马向下
- searchableSelect下拉框插件增加按拼音及首拼搜索
- docker使用docker compose file部署项目时,实现容器卷挂载,并对容器内文件夹赋予权限
- [业务知识] 深入了解医联体和医共体
- VSCode 代码块/全文 折叠/展开 快捷键
- 【渝粤教育】国家开放大学2018年春季 0049-22T法律文书 参考试题
- 彻底对一个男人失望的瞬间
- 高性能计算与高性能计算机讲座笔记
- Duplicate Entry
- 洛谷4895 BZOJ3162 独钓寒江雪 树形dp 树哈希