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

相关推荐

  • windows U盘启动bios如何设置

    U盘启动bios设置方法: 1、将制作好的u盘启动盘插入电脑usb接口后,重启电脑按f2进入到bios界面, 然后切换至boot选项卡,选中External Device Boot并按回车,将其改为Enabled。 2、然后依然在boot选项卡中,按方向键“↑、↓”选择External Device…

    2022年9月22日
    7800
  • windows任务管理器怎么打开

    任务管理器打开的详细方法 方法一:右键点击任务栏空白处,然后点击“任务管理器”即可。 方法二:同时按下“Win+R”键,然后在弹出的对话框中输入“cmd”并按回车键。 接着在任务管理器输入“taskmgr”运行即可。 方法三:同时按下“Ctrl+Alt+Delete”键即可。 方法四、按“WIN+X…

    2022年9月5日
    6500
  • windows office365企业版和家庭版区别的是什么

    office365企业版和家庭版区别: 用户数: 1、office家庭版:最多支持 6 位用户。 2、office企业版:最多支持 300 位用户。 许可证: 1、office家庭版:具备家用许可证。 2、office企业版:具备企业许可证。 功能: 1、office企业版相比家庭版,支持更多功能。…

    2022年9月21日
    18200
  • word字体放大如何居中

    word字体放大居中的方法 1、首先打开word,选中你要放大居中的文字, 点击开始菜单栏的字号,这里选择的最大字号是72号。 2、这时可以直接在字号框里输入数字,数字越大字越大。 3、选择菜单栏“布局”–“纸张方向”–“横向”,来调整页面方向。 4、在菜单栏点击“布局”–…

    2022年9月15日
    40400
  • 疫情期间,HR团队是如何实行远程办公的?

    2020年的春节是个不平常的春节,新型冠状病毒突如其来,为了控制病毒传播,国务院办公厅宣布延长2020年春节假期至2月2日,各地政府也相继出台了延期开工政策。 Worktile积极响应国家政策,保障每位员工的身体健康,决定全体员工先在家远程办公。为了战胜疫情,实现真正有效率有成果的远程办公,公司HR…

    2022年3月20日
    21600
  • Redis处理接口幂等性的方案有哪些

    前言:接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。接口幂等性是指用户对于同一操作发起的一次请求或者多次…

    2022年8月31日
    21900
  • word文档怎么转换成pdf格式

    word文档转换成pdf格式方法: 1、打开word,打开需要转换的文档。 2、点击左上角的文件选项,如图。 3、选择导出功能。 4、选择创建PDF/XPS文档,点击创建 5、选择合适的位置,自定义文件的名称即可。 6、此时打开文件的格式就已经被转换为PDF文件。 到此,相信大家对“word文档怎么…

    2022年9月19日
    6000
  • 如何使用css实现​文本渐变

    文本渐变 文本渐变效果很流行,使用 CSS3 能够很简单就实现: h3[data-text] { position: relative;}h3[data-text]::after { content: attr(data-text); z-index: 10; color: #e3e3e3; pos…

    2022年9月1日
    6500
  • mysql怎么设置最大连接数

    方法一:命令行修改 我们只需要打开mysql的控制台,输入“set GLOBAL max_connections=1000;”语句,就可直接设置最大连接数,如下图所示: 注:这种方法标不治本,只能暂时的修改最大连接数,一点重启mysql,最大连接数又会变回原先设置的值。 方法二:通过mysql配置文…

    2022年9月15日
    8800
  • windows驱动精灵护眼如何卸载

    驱动精灵护眼卸载方法: 1、右击任务栏,点击“任务管理器”。 2、在任务管理器找到“护眼大师”,点击“结束任务”。 3、点击“此电脑”,选择“系统c盘”。 4、点击文件夹“Program Files(x86)”。 5、右击文件夹“kherlthey”点击“删除”即可。 读到这里,这篇“windows…

    2022年9月10日
    23800
联系我们
站长微信
站长微信
分享本页
返回顶部