美文网首页
连接查询简单分析

连接查询简单分析

作者: 赵信信官属 | 来源:发表于2022-04-07 12:37 被阅读0次

【1】

CREATE TABLE `t_2` (
  `u_name` char(10) DEFAULT NULL,
  `year` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `t_3` (
  `u_name` char(10) DEFAULT NULL,
  `year` int(11) DEFAULT NULL,
  KEY `idx_year_u_name` (`year`,`u_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

explain select * from t_3 left join t_2 on(t_3.u_name=t_2.u_name) and (t_3.year=1992);

t_3 驱动表
t_2 被驱动表

图片.png

如上图的执行计划, SELECT * 的数据可以从idx_year_u_name索引直接全部获取, 因此t_3表可通过扫描索引(type=index),而非全表扫描.

【2】

CREATE TABLE `t_4` (
  `u_name` char(10) DEFAULT NULL,
  `year` int(11) DEFAULT NULL,
  `address` varchar(10) DEFAULT NULL,
  KEY `idx_year_u_name` (`year`,`u_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

explain select * from t_4 left join t_2 on(t_4.u_name=t_2.u_name) and (t_4.year=1992);

t_4 驱动表
t_2 被驱动表

图片.png

如上图的执行计划, SELECT * 的数据(u_name,year,address)不可以从idx_year_u_name(year,u_name)索引直接全部获取, 因此t_4表只能通过全表扫描(type=ALL).

【3】
explain select * from t_4 left join t_2 on(t_4.u_name=t_2.u_name) and (t_4.year=1992);
explain select * from t_4 left join t_2 on(t_4.u_name=t_2.u_name) where (t_4.year=1992);

如果采用BNL算法的话

1.将驱动表t_4中满足WHERE子句的数据放入 join buffer.
2.顺序扫描被驱动表t_2每一行数据, 判断与 join buffer 中的数据是否满足 on ... and ... 条件, 满足条件则放入结果集.
3.被驱动表t_2扫描完成之后, 对于驱动表t_4中未匹配到的数据行, 把剩余字段补NULL, 并放入结果集.

【4】

CREATE TABLE `t_1` (
  `u_name` char(10) DEFAULT NULL,
  `year` int(11) DEFAULT NULL,
  KEY `idx_u_name` (`u_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `t_2` (
  `u_name` char(10) DEFAULT NULL,
  `year` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

select * from t_1 left join t_2 on(t_1.u_name=t_2.u_name) where (t_1.year=t_2.year);
优化器将其改写成了 JOIN , 即 select * from t_1 join t_2 where (t_1.u_name=t_2.u_name) and (t_1.year=t_2.year);

select * from t_1 left join t_2 on(t_1.u_name=t_2.u_name) where (t_2.year=1992);
优化器将其改写成了 JOIN , 即 select * from t_1 join t_2 where (t_1.u_name=t_2.u_name) and (t_2.year=1992);

explain extended + 原SQL
show warnings;
执行以上2个命令之后, 就可以查看到实际被优化器执行的SQL

一旦WHERE条件中包含LEFT JOIN右侧表的字段, LEFT JOIN的语义与JOIN一样, 则优化器将其改成JOIN

相关文章

  • 连接查询简单分析

    【1】 explain select * from t_3 left join t_2 on(t_3.u_name...

  • SQL常用语法

    创建库: 创建表 修改表 简单查询1 简单查询2(通配符) 简单查询3 连接查询 外部连接查询: 嵌套查询1: 注...

  • 面试题:说说地址栏输入 URL 敲下回车后发生了什么?

    一、简单分析 简单的分析,从输入 URL到回车后发生的行为如下: URL解析 DNS 查询 TCP 连接 HTTP...

  • Mysql的点点滴滴

    Mysql 的查询执行过程 客户端的查询语句->服务端连接器管理连接,查询权限 -> 服务端分析器进行词法分析 语...

  • MySQL~高级查询

    一、多表查询 1、内连接查询 内连接通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。简单...

  • sql

    sql语句 查询 简单查询 例: 多表连接查询 例: 2.更新

  • 51cto赵强HADOOP学习(十六)hive的数据查询

    简单查询 查询的语法 过滤和排序 在查询中使用过滤 在查询中使用排序 Hive的表连接 等值连接 不等值连接 外连...

  • mysql 联表查询

    mysql 联表查询 JOIN 对比 思路: 1.分析需求,分析查询的字段来自哪些表(连接查询) 2.确定使用哪...

  • SQL初认识——16:连接查询

    连接查询 连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集...

  • mysql连接查询,自关联,子查询

    mysql支持三种类型的连接查询,分别为:内连接查询,左连接查询,右连接查询 内连接查询: 左连接查询: 右连接查...

网友评论

      本文标题:连接查询简单分析

      本文链接:https://www.haomeiwen.com/subject/jsvjsrtx.html