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的优化相关推荐

  1. spark1.4加载mysql数据 创建Dataframe及join操作连接方法问题

    首先我们使用新的API方法连接mysql加载数据 创建DF import org.apache.spark.sql.DataFrame import org.apache.spark.{SparkCo ...

  2. mysql的join算法_mysql的Join算法-阿里云开发者社区

    实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 测试数据 CREATE TABLE `dept_emp` ( `emp_no` int(11) NOT NULL, `dept_no` char(4) N ...

  3. 如何在MySQL中进行FULL OUTER JOIN?

    我想在MySQL中进行完全外部联接. 这可能吗? MySQL是否支持完全外部联接? #1楼 在SQLite中,您应该这样做: SELECT * FROM leftTable lt LEFT JOIN ...

  4. mysql的left join和inner join的效率对比,以及如何优化

    一.前言 最近在写代码的时候,遇到了需要多表连接的一个问题,初始sql类似于: select * from a left join b on a.x = b.x left join c on c.y ...

  5. mysql sql left right inner join区别及效率比较

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...

  6. mysql natural join用法_MySQL NATURAL JOIN

    NATURAL JOIN 也叫自然连接,实际是属于 JOIN 的一种. MySQL NATURAL JOIN 语法如下: ... FROM table1 NATURAL JOIN table2 ... ...

  7. mysql不用left join_MySQL在右表数据不唯一的情况下使用left join的方法_MySQL - join

    一.Join语法概述join 用于多表中字段之间的联系,语法如下:... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditionatable1:左表 ...

  8. mysql语法中的join_MySQL JOIN 语法说明与 图解

    一.MySQL JOIN 分类 JOIN 按照功能大致分为如下三类: INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记 ...

  9. Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...

最新文章

  1. ASP.NET 定时执行任务(定时器)
  2. php轻量级的性能分析工具xhprof的安装使用
  3. sum和total的区别
  4. LeetCode 246. 中心对称数(哈希)
  5. python性能测试台_性能测试平台效率优化的一次经验(python版)
  6. ssis中数据类型_SSIS中的数据挖掘查询
  7. 英国莽汉司机认罪:放任特斯拉自动驾驶,自己躺在副驾悠哉悠哉
  8. [翻译] TLMotionEffect 重力感应
  9. 2020公务员考试应届毕业生的身份界定
  10. CAD计算机辅助设计——文件管理和界面设置
  11. 【解局】瑞幸向上,盒马向下
  12. searchableSelect下拉框插件增加按拼音及首拼搜索
  13. docker使用docker compose file部署项目时,实现容器卷挂载,并对容器内文件夹赋予权限
  14. [业务知识] 深入了解医联体和医共体
  15. VSCode 代码块/全文 折叠/展开 快捷键
  16. 【渝粤教育】国家开放大学2018年春季 0049-22T法律文书 参考试题
  17. 彻底对一个男人失望的瞬间
  18. 高性能计算与高性能计算机讲座笔记
  19. Duplicate Entry
  20. 洛谷4895 BZOJ3162 独钓寒江雪 树形dp 树哈希

热门文章

  1. angular 错误处理_可能出什么问题了? 如何处理Angular中的错误
  2. 比特币未来几个月怎么样_您需要了解的关于比特币技术的未来
  3. github pages_在GitHub Pages上发布组织主页
  4. 使用Redux-Saga进行异步操作
  5. PAT:组个最小数(C++)
  6. 枚举变量的重定义问题
  7. Python实现二分法搜索
  8. 如何快速查找下载java项目所需jar包
  9. sql GROUP BY子句使用实例
  10. 查看回调函数执行在那个线程中的方法