联表查询做开发的小伙伴会经常使用,但是可以大家都比较少去深入了解MySQL是怎么执行多表联表查询的,比如怎么选择驱动表(第一个被处理的表),是先联表还是说先根据where条件(前提是有where条件)进行过滤后在进行联表搜索符合条件的结果,等等。那这个里面可能涉及到的知识点比较多,就不仅仅是今天要讨论的驱动表的选择,还需要小伙伴们去了解更多相关的知识,比如:索引 ICP,nested_loop算法等等。后面笔者将更新相关的文章,供小伙伴们参考。

1. 联表的类型

我们经常使用的多表连接类型有以下三类:

1) 左连接(left join)

2) 右连接(right join)

3) 内连接(inner join)

关于这三种连接的区别,笔者在这里就不多说了,不了解的小伙伴们可以查阅相关的资料。

下面针对这三种连接分别做测试。

2.实践

在这里小伙伴们自己要准备两张表,笔者这里准备的是app,app_ext 这两张表,笔者这两张表比较复杂,这里就不全部展示出来了,需要注意的是笔者这里的mysql版本是8.0的。

1) 左连接和右连接

执行 explain select a.id,a.name,b.grade from app a left join app_ext b on a.id = b.appid; 其中a.id 是主键并且是自增的,app_ext 中的appid 与app.id 是关联的。输出结果如下:

left_join.png

我们可以看到驱动表是我们的a表,下面我们改成right join 看下:

explain select a.id,a.name,b.grade from app a right join app_ext b on a.id = b.appid;

right_join.png

可以看到mysql 选择了b表作为驱动表。

其实从上面的运行结果我们可以得出,左连接或者右连接的情况下是不管表中的记录数的,如果是左连接会选择左边的表作为驱动表,如果是右连接会选择右边的表作为驱动表。

2) 内连接

explain select a.id,a.name,b.grade from app a inner join app_ext b on a.id = b.appid;

输出结果如下:

right_join.png

此时mysql 选择了b表作为了驱动表。下面我们再加些条件来看下运行结果:

explain select a.id,a.name,b.grade from app a inner join app_ext b on a.id = b.appid where a.name = '剑仙缘';

right_join.png

我们看到mysql仍然是选择b表作为驱动表,我们再来单独分析下这条sql语句:

mysql > select count(id) from app where name = '剑仙缘';

+-----------+

| count(id) |

+-----------+

| 2 |

+-----------+

可以看到满足条件的记录实际上只有两行,下面使用explain 来看下这条语句的执行计划。

mysql > explain select id,name from app where name = '剑仙缘';

explain.png

我们发现执行计划里面的rows仍然是需要扫描8137行数据,所以加上这个where条件并不能改变mysql所选择的驱动表。那如果where的条件是有索引的情况了,比如利用user_id字段来检索,下图是笔者app数据表里面的索引:

表索引.png

mysql > explain select a.id,a.name,b.grade from app a inner join app_ext b on a.id = b.appid where a.user_id= 1079;

explain.png

我们发现此时mysql选择了a表作为了驱动表,我们再来单独分析下select id,name from app where user_id = 1079;这条语句:

mysql > explain select id,name from app where user_id = 1079;

explain.png

我们发现此时mysql扫描的次数大大减少了,原因很简单,因为mysql利用了索引,所以无需全部扫描。

总结:对于内连接mysql会选择扫描次数比较少的作为驱动表。

最后一点:我们从上面的测试结果中可以看出:当查询语句里面的where条件涉及到索引时,mysql会事先根据索引去过滤到一部分不符合条件的数据,然后再去和另外一张表的数据做匹配,反之,则会对全表进行扫描,等把所有的记录都查询出来再做过滤,这其实也是mysql内部做的一个优化-索引ICP,笔者将在后面的文章里面做详细的介绍。

好了,本篇文章就介绍到这里了,有不对的地方,欢迎小伙伴们指出,看到会及时回复的。

mysql左驱动表_MySQL多表联表查询驱动表选择相关推荐

  1. mysql左键关联_MySQL的:左键删除重复列加入,3个表

    我有一个表,使用3个外键到其他表.当我执行左连接时,我会收到重复的列. MySQL表示,USING语法将减少重复的列,但没有多个键的示例. 鉴于: mysql> describe recipes ...

  2. 虚拟机mysql创建一个表_MySQL:创建、修改和删除表

    其实对很多人来说对于SQL语句已经忘了很多,或者说是不懂很多,因为有数据库图形操作软件,方便了大家,但是我们不能忘记最根本的东西,特别是一些细节上的东西,可能你用惯了Hibernate,不用写SQL语 ...

  3. 如何用mysql创建orders表_MySQL学习十四创建和操纵表

    摘要: 本篇博客仅作为笔记,如有侵权,请联系,立即删除(网上找博客学习,然后手记笔记,因纸质笔记不便保存,所以保存到网络笔记). 本博讲述表的创建.更改和删除的基本知识. 一.创建表 MySQL不仅用 ...

  4. mysql cte的好处_Mysql 8 重要新特性 - CTE 通用表表达式

    前言 Mysql 8 正式发布了,新增了很多优秀特性,之后我会挑些重点来分享. 下面和大家一起熟悉下CTE(Common Table Expressions)通用表表达式. CTE 是什么 派生表大家 ...

  5. 怎么查找表_MySQL索引是怎么支撑千万级表的快速查找?

    前言 在 MySQL 官方提到,改善操作性能的最佳方法 SELECT在查询中测试的一个或多个列上创建索引.索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与WHERE子句中的条件匹配, ...

  6. mysql左对齐原则_MySQL 设计与开发规范

    MySQL 设计与开发规范 1 目的 本规范的主要目的是希望规范数据库设计与开发,尽量避免由于数据库设计与开发不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保 ...

  7. delete 会不会锁表_MySQL的insert into select 引发锁表

    上周五HaC我要上线,有一个脚本需要执行,执行前需要备份一个表. 运维大佬:"这个表的备份为什么要这么久,,??" 1秒过去了--2秒过去了-- 期间运营反馈系统出现大量订单超时情 ...

  8. mysql 拼音首字母_Mysql:拼音首字母查询(超高性能)

    注:不用新建表,查询性能高,可以兼容中英文 简单分析 应用场景:通常对地址或者数量较多的分类会选择首字母查询的方法 性能考虑:PHP中进行首字母查询,网上可以找到很多脚本实现,但需要将所有数据进行读出 ...

  9. mysql like 替代算法_mysql – 什么是替代连接查询

    表:项目 +---+-----------+ |id | name | +---+-----------+ | 1 | Product-A | | 2 | Product-B | +---+----- ...

  10. mysql同时更新2个表_mysql中同时update更新多个表

    本节内容: 在mysql数据库中实现update同时更新多个表. 1,同时更新的多个表之间无联系统 复制代码 代码示例: update table1 t1,table2 t2 set t1.a=1,t ...

最新文章

  1. 数据中心内虚拟机迁移带来的网络技术难题
  2. Python基础-面向对象编程
  3. 吴恩达:大数据终将帮助机器拥有自主智慧
  4. Python基础——PyCharm版本——第八章、文件I/O(核心3、csv和excel解析)
  5. SAP Spartacus Cart UI 修改 quantity 字段后的 Patch 请求遇到 400 错误 - IllegalArgumentError
  6. Python缩进问题
  7. baseline如何发布_baseline-简单的字符串基线。-Dan Gass
  8. 华为数通设备配置导出
  9. hadoop、spark、hive、solr、es与YDB在车辆即席分析上的对比分析
  10. 向日葵显示不能连接服务器,手机向日葵远程连接服务器
  11. c计算机软考中级考什么,计算机软考中级考试内容
  12. 深入PCI与PCIe之一:硬件篇
  13. 工控随笔_08_西门子_Win10安装Step7.V5.6中文版授权管理器不能正常启动
  14. 构建自己的Linux 之三 初步完善(提供网络功能等)
  15. 已解决The method is not allowed for the requested URL.
  16. 国内与国外CRM系统相比有哪些优劣势?
  17. 计算机中存储的数据类型
  18. 晶豪(ESMT)nand flash对内存页的读取、ECC校验 F59L2G81A
  19. 关闭应用右下角的盾牌图标
  20. 【HDOJ】4642 Fliping game_天涯浪子_新浪博客

热门文章

  1. 提高社群活跃度的5个方法
  2. UEditor写入源代码后,格式乱掉。少标签,div不见,多空行等等错误!(已解决)...
  3. 如何购买感冒药,咳嗽药,喉咙痛药
  4. 装修鸿蒙瓷砖选择,瓷砖到货时发现碎了,让师傅说家里瓷砖破损怎么办?
  5. iperf —— 网络性能测试工具,编译、安装、使用笔记
  6. JavaScript 函数式编程(一)
  7. python数组分组
  8. 竖屏视频文件怎么快速转换
  9. Itext5库的对PDF文件的基本操作(一)---新建文档,设置文档属性,设置文档密码
  10. Java面试题(十) - SQL语句的优化