加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中的join语句算法及优化方式

发布时间:2022-01-19 09:39:44 所属栏目:MySql教程 来源:互联网
导读:本篇内容主要讲解MySQL中的join语句算法及优化方法,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习MySQL中的join语句算法及优化方法吧! 一、join语句算法 创建两个表t1和t2 CREATE TABLE `t2` ( `id` int(11) NO
         本篇内容主要讲解“MySQL中的join语句算法及优化方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL中的join语句算法及优化方法”吧!
 
一、join语句算法
         创建两个表t1和t2
 
CREATE TABLE `t2` (
  `id` int(11) NOT NULL,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `a` (`a`)
) ENGINE=InnoDB;
 
1、Index Nested-Loop Join
select * from t1 straight_join t2 on (t1.a=t2.a);
如果直接使用join语句,MySQL优化器可能会选择表t1或t2作为驱动表,通过straight_join让MySQL使用固定的连接方式执行查询,在这个语句里,t1是驱动表,t2是被驱动表
 
MySQL中的join语句算法及优化方法
被驱动表t2的字段a上有索引,join过程用上了这个索引,因此这个语句的执行流程是这样的:
 
1.从表t1中读入一行数据R
 
2.从数据行R中,取出a字段到表t2里去查找
 
3.取出表t2中满足条件的行,跟R组成一行,作为结果集的一部分
 
4.重复执行步骤1到3,直到表t1的末尾循环结束
 
这个过程可以用上被驱动表的索引,称之为Index Nested-Loop Join,简称NLJ
 
在这个流程里:
 
1.对驱动表t1做了全表扫描,这个过程需要扫描100行
 
2.而对于每一行R,根据a字段去表t2查找,走的是树搜索过程。由于我们构造的数据都是一一对应的,因此每次的搜索过程都只扫描一行,也是总共扫描100行
 
3.所以,整个执行流程,总扫描行数是200
 
假设不使用join,只能用单表查询:
 
1.执行select * from t1,查出表t1的所有数据,这里有100行
 
2.循环遍历这100行数据:
 
从每一行R取出字段a的值$R.a
执行select * from t2 where a=$R.a
把返回的结果和R构成结果集的一行
这个查询过程,也是扫描了200行,但是总共执行了101条语句,比直接join多了100次交互。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!