首页 > 数据库 >MySQL的join算法优化

MySQL的join算法优化

时间:2022-09-25 21:34:01浏览次数:64  
标签:Join 内表 Nested 算法 MySQL join table Loop

在Mysql的实现中,Nested-Loop Join有3种实现的算法:

  • Simple Nested-Loop Join:SNLJ,简单嵌套循环连接
  • Index Nested-Loop Join:INLJ,索引嵌套循环连接
  • Block Nested-Loop Join:BNLJ,缓存块嵌套循环连接

 

在选择Join算法时,会有优先级,理论上会优先判断能否使用INLJ、BNLJ(mysql内部优化后,基本上不会出现Simple Nested-Loop Join):
Index Nested-LoopJoin > Block Nested-Loop Join > Simple Nested-Loop Join

1、Simple Nested-Loop(笛卡尔积)

  1. 简单嵌套循环连接实际上就是简单粗暴的嵌套循环,如果table1有1万条数据,table2有1万条数据,那么数据比较的次数=1万 * 1万 =1亿次,这种查询效率会非常慢。table 1中的每条记录在比较匹配时,都会去扫描一次table 2 。

 

2、Index Nested-LoopJoin(减少内表的匹配次数)

1)前提条件,内表的关联字段上有索引

2)外表符合条件的记录,通过内表关联字段,通过索引查找进行匹配,减少比较次数:

  • 原来的匹配次数 = 外层表行数 * 内层表行数
  • 优化后的匹配次数= 外层表的行数 * 内层表索引的高度

3)如果关联字段的索引是二级索引,而且返回的数据中还包含内表其他列数据,则内表还需要进行回表查询,会额外多了一些IO操作。

 

 

3、Block Nested-Loop Join(减少内表扫描次数)

1)查询table 1符合条件的记录,一次性缓存到join buffer中,然后拿join buffer里的数据批量与内层表的数据进行匹配,从而减少了内表的扫描次数(内表扫描一次就可以批量匹配Join Buffer里面的外层表数据,即把join buffer当成一条记录看待)。

2)mysql将join优化后,在不使用Index Nested-Loop Join的时候,默认使用Block Nested-Loop Join。

3)什么是Join Buffer?

  • Join Buffer会缓存所有参与查询的列而不是只有Join的列。
  • 可以通过调整join_buffer_size缓存大小
  • join_buffer_size的默认值是256K,join_buffer_size的最大值在MySQL 5.1.22版本前是4G-1,而之后的版本才能在64位操作系统下申请大于4G的Join Buffer空间。
  • 使用Block Nested-Loop Join算法需要开启优化器管理配置的optimizer_switch的设置block_nested_loop为on,默认为开启。

 

4、三种算法比较

假设table 1和table 2的记录如下:

table 1             table 2

1                     1

2                     2

3                     3

                       4

 

select * from table1 join table2 on table1.id=table2.id

 

 

 

标签:Join,内表,Nested,算法,MySQL,join,table,Loop
From: https://www.cnblogs.com/broadway/p/16729024.html

相关文章

  • MySQL 的一条语句的执行流程
    分为客户端,服务端,存储引擎三部分。mysql8.0后,取消缓存。1.myisam和innodb的区别。Mysql的InnoDB和MyISAM存储引擎的常见区别如下:锁支持:MyISAM只有表级锁(table-lev......
  • mysql存储引擎
    MySQL存储引擎概述MySQL5.0支持的存储引擎包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDBCluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中Inno......
  • mysql整理
    mysql整理跨库更新数据UPDATEpmcc_assess.tb_project_infoaTableINNERJOIN(SELECTidasdata_id,uuidasdata_uuidFROMpmcc_contract.tb_cms_contractbTa......
  • mysql函数
    日期函数返回当前日期,只包含年月日selectcurdate()返回当前时间,只包含时分秒selectcurtime()返回当前的日期和时间,年月日时分秒全都包含selectnow()提取......
  • mysql_数据库设计三范式
    设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。目前关系数据库有六......
  • mysql事务
    什么是事务一系列有序的数据库操作:要么全部成功要么全部回退到操作前的状态中间状态对其他连接不可见事务的基本操作:|基本操作|说明||:-------------|:-......
  • mysql 数据库设计的规范
    数据库设计的规范数据库表和字段都大写表都要加业务后缀,例如_C客户表_B基础表_P权限表必须有主键,主键是表名去掉业务后缀,加_ID,大多表的主键使用UUID字段多个单词时,......
  • mysql正则表达式
    一:数据准备CREATETABLE`t_user`(`USER_ID`intNOTNULLAUTO_INCREMENT,`USER_NAME`char(255)CHARACTERSETutf8COLLATEutf8_general_ciNOTNULL,`US......
  • mysql运维
    一:备份1:备份内容数据(数据文件或文本格式数据)操作日志(binlog)(数据库变更日志)2:冷备份与热备份冷备份(关闭数据库服务,完整拷贝数据文件)热备份......
  • mysql存储过程
    MySQLmysql存储过程概述存储过程是存储在数据库的一组SQL语句集,用户可以通过存储过程名和传参多次调用的程序模块。特点:使用灵活,可以使用流控制语句,自定义变量等完......