MySQL优化器hash join怎么使用

前言

数据库的优化器相当于人类的大脑,大部分时候都能做出正确的决策,制定正确的执行计划,走出一条高效的路,但是它毕竟是基于某些固定的规则、算法来做的判断,有时候并没有我们人脑思维灵活,当我们确定优化器选择执行计划错误时该怎么办呢,语句上加hint,提示它选择哪条路是一种常见的优化方法。

我们知道Oracle提供了比较灵活的hint提示来指示优化器在多表连接时选择哪种表连接方式,比如use_nlno_use_nl控制是否使用Nest Loop Join,use_hash,no_use_hash控制是否使用hash join

但是MySQL长期以来只有一种表连接方式,那就是Nest Loop Join,直到MySQL8.0.18版本才出现了hash join, 所以MySQL在控制表连接方式上没有提供那么多丰富的hint给我们使用,hash_joinno_hash_join的hint只是惊鸿一瞥,只在8.0.18版本存在,8.0.19及后面的版本又将这个hint给废弃了,那如果我们想让两个表做hash join该怎么办呢?

实验

我们来以MySQL8.0.25的单机环境做一个实验。建两个表,分别插入10000行数据,使用主键做这两个表的关联查询。

create table t1(id int primary key,c1 int,c2 int);create table t2(id int primary key,c1 int,c2 int);delimiter //CREATE PROCEDURE p_test()BEGINdeclare i int;set i=1;while i<10001 doinsert into t1 values(i,i,i);insert into t2 values(i,i,i);SET i = i + 1;end while;END;//delimiter ;

查询一下两表使用主键字段关联查询时实际的执行计划,如下图所示:

MySQL优化器hash join怎么使用

查询一下两表使用非索引字段关联查询时实际的执行计划,如下图所示:

MySQL优化器hash join怎么使用

从执行计划可以看出,被驱动表的关联字段上有索引,优化器在选择表连接方式时会倾向于选择Nest Loop Join,当没有可用索引时倾向于选择hash join。

基于这一点那我们可以使用no_index提示来禁止语句使用关联字段的索引。

MySQL优化器hash join怎么使用

从上面的执行计划可以看出使用no_index提示后,优化器选择了使用hash join。

当索引的选择性不好时,优化器选择使用索引做Nest Loop Join是效率是很低的。

我们将实验的两个表中c1列的数据做一下更改,使其选择性变差,并在c1列上建普通索引。

update t1 set c1=1 where id<5000;update t2 set c1=1 where id<5000;create index idx_t1 on t1(c1);create index idx_t2 on t2(c1);

当我们执行sql :

select t1.*,t2.* from t1 join t2 on t1.c1=t2.c1;

这个查询结果会返回大量数据,被驱动表的关联字段c1列的索引选择性差,此时选择hash join是更明智的选择,但是优化器会选择走Nest Loop Join。我们可以通过实验验证一下hash join 与 Nest Loop Join的性能差异。

MySQL优化器hash join怎么使用

可以看出使用hash join的耗时是使用Nest Loop Join的1/6,但是优化器根据成本估算时,使用Nest Loop Join的成本要比使用hash join的成本低很多,所以会去选择Nest Loop Join,这个时候就需要加上hint 提示禁止使用关联字段的索引,被驱动表上每次都全表扫描的代价是很高的,这样优化器估算后就会选择走hash join。

MySQL官方文档里提到用BNLNO_BNL的hint提示来影响hash join的优化,但是经过实验证明,在表连接关联字段上没有可用索引时,优化器估算成本后不会对被驱动表使用BNL全表扫描的方式做嵌套循环连接,而是会选择使用hash join,那这样NO_BNL在这个场景下就没有用武之地了。

那么既然不用这个索引,把这个索引去掉不就可以了吗?为什么非要使用no_index的hint提示呢,我们要知道业务使用的场景何其多,此处不用,别处使用了这个索引效率可能会有大的提升啊,这个时候就凸显了hint的优势,只需要控制此语句的使用就好了。

以上就是“MySQL优化器hash join怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

文章标题:MySQL优化器hash join怎么使用,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/25401

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月15日 下午11:17
下一篇 2022年9月15日 下午11:18

相关推荐

  • App崩溃的6个常见原因是什么

    人们讨厌应用程序崩溃,尤其是是程序减速或卡死几秒钟这样的现象。根据Dimensional Research的一项调查,61%的用户希望程序在4秒内启动,而49%的用户希望在2秒内响应输入。 如果应用发生崩溃,冻结或报错等现象,53%的用户会将APP卸载。 无论您的对象是消费者还是企业,崩溃问题会令他…

    2022年9月2日
    1.6K00
  • Vue.js 前端路由和异步组件是什么

    目录 文章目标 P6 P6+ ~ P7 一、背景 二、前端路由特性 三、面试!!! 四、Hash 原理及实现 1、特性 2、如何更改 hash 3、手动实现一个基于 hash 的路由 五、History 原理及实现 1、HTML5 History 常用的 API 2、pushState/replac…

    2022年9月13日
    58000
  • python标准库模块之json库怎么使用

    前言 json,全称为JavaScript Object Notation,也就是JavaScript对象标记,通过对象和数组的组合表示数据,虽然构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。 作用 主要用于将python对象编码为json格式输出或存储,以及将json格式对象解码为py…

    2022年9月21日
    84300
  • css如何实现平行四边形

    平行四边形 #parallelogram { width: 150px; height: 100px; transform: skew(20deg); background: red;} 以上是“css如何实现平行四边形”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对…

    2022年8月31日
    38700
  • 如何用transition实现短视频APP的点赞动画

    实现不同表情的不断上升 如果使用纯 CSS 实现这一整套动画的话。我们首先需要实现一段无限循环的,大量不同的表情不断向上漂浮的动画。 像是这样: 这个整体还是比较容易实现的,核心原理就是同一个动画,设置不同的 transition-duration,transition-dalay,和一定范围内的旋…

    2022年9月8日
    56400
  • 如何实现APT32样本分析

    一、基本信息 样本MD5 bb3306543ff********9372bb3c72712 样本文件大小 3.29 MB (3,449,856 字节) 样本类型 后门程序 样本描述 利用Office恶意宏加载木马模块 分析时间 2019年12月 二、分析 2.1简介 该恶意文档,共被植入了三段恶意宏…

    2022年9月18日
    62300
  • windows ddu卡在清理注册表如何解决

    解决方法: 1、其实卡在清理注册表是因为win10系统版本不兼容导致的无法正常显示问题。 2、虽然软件没有提示清理成功,但是显卡驱动程序其实已经完成清理或卸载了。 3、所以大家不需要担心,卡在清理注册表一段时间后,直接关闭或推出软件即可。 4、如果我们不确定的话,可以打开“设备管理器” 5、然后在显…

    2022年9月20日
    57500
  • 对混淆变形的Webshell分析是怎样的

    WebShell是什么? 在最初的时候,Webshell经常被用来作为Web服务器管理员对服务器进行远程管理的一类脚本的简称。后来,随着一些Webshell管理工具的诞生,使得获取Web权限的过程被很大程度地简易化,于是逐渐被称为Web入侵的工具脚本。 Webshell不同于漏洞,而是利用应用漏洞或…

    2022年9月22日
    52100
  • word字体放大如何弄

    word字体放大的方法 1、先选中需要放大的字体,然后点击开始菜单中的增大字号。 2、选中字体之后在悬浮框中点击字体大小就可以设置了。 3、选中需要放大的字体之后,点击上方菜单栏中的输入框,直接在里面输入你要的字号。 以上就是“word字体放大如何弄”这篇文章的所有内容,感谢各位的阅读!相信大家阅读…

    2022年9月10日
    51600
  • apache flink任意jar包上传导致远程代码执行的示例分析

    漏洞描述: 2019年11月11号,安全工程师Henry Chen披露了一个Apache Flink未授权上传jar包导致远程代码执行的漏洞。由于Apache Flink Dashboard 默认无需认证即可访问,通过上传恶意jar包并触发恶意代码执行,从而获取shell。 影响范围 <= 1…

    2022年9月18日
    92000
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部