为何阿里不推荐MySQL使用join?(上)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 为何阿里不推荐MySQL使用join?
  • DBA禁用join
  • 若有两个大小不同的表做join,用哪个表做驱动表?


今天这篇文章,我就先跟你说说join语句到底是怎么执行的,然后再来回答这两个问题。

示例表:

image.png

  • 往表t2里插入了1000行数据

1.png

  • 在表t1里插入的是100行数据

image.png

可见,两表都有一个主键索引id和一个索引a

Index Nested-Loop Join

select *
from t1 straight_join t2 on (t1.a = t2.a);

若直接使用join语句,MySQL优化器可能会选择表t1或t2作为驱动表,这会影响我们分析SQL语句的执行过程。为便于分析执行过程中的性能,改用straight_join让MySQL使用固定的连接方式执行查询,这样优化器只会按照我们指定的方式去join。所以,该语句里:


  1. t1 是驱动表
  2. t2是被驱动表
  3. 使用索引字段join的 explain结果


image.png

t2的字段a上有索引,join过程用了该索引,因此该语句执行流程:

  1. 从t1读入一行数据 R
  2. 从数据行R中,取出a字段到t2里查找
  3. 取出t2中满足条件的行,跟R组成一行,作为结果集一部分
  4. 重复执行步骤1到3,直到t1的末尾循环结束


这个过程是先遍历t1,然后根据从t1中取出的每行数据中的a值,去t2中查找满足条件的记录。形式上和我们写程序时的嵌套查询类似,并且可以用上被驱动表的索引,称之为“Index Nested-Loop Join”,NLJ。


  • Index Nested-Loop Join算法的执行流程
    TODO


该流程:

  1. 对驱动表t1做了全表扫描,需扫描100行
  2. 对于每一行R,根据a字段去t2查找,这是树搜索。由于构造数据一一对应,因此每次搜索过程都只扫描一行,共扫描100行
  3. 所以,整个执行流程,总扫描行数是200


所以能不能使用join?

假设不使用join,那就只能用单表查询:

select * from t1

查出t1所有数据,这里有100行。

循环遍历这100行数据:


  • 从每一行R取出字段a的值$R.a
  • 执行select * from t2 where a=$R.a
  • 把返回的结果和R构成结果集的一行


该查询过程,也扫描了200行,但共执行了101条语句,比join多了100次交互。而且客户端还要自己拼接SQL语句和结果。

这性能还不如直接join。

怎么选择驱动表?

该示例中,驱动表t1走全表扫描,被驱动表t2走树搜索。


假设被驱动表行数M。每次在被驱动表查一行数据,要先搜索索引a,再搜索主键索引。每次搜索一棵树的时间复杂度log2M,所以在被驱动表上查一行的时间复杂度是 2*log2M


假设驱动表行数N,执行过程就要扫描驱动表N行,然后对每一行,到被驱动表上匹配一次。

因此整个执行过程,时间复杂度是 N + N*2*log2M。N扩大1000倍,扫描行数就会扩大1000倍;而M扩大1000倍,扫描行数扩大不到10倍。


可见,N严重影响扫描行数,应该让小表做驱动表。

小结

  • 使用join语句,性能比强行拆成多个单表执行SQL语句的性能要好
  • 如果使用join语句的话,需要让小表做驱动表。

这些结论的前提是“可以使用被驱动表的索引”。

若被驱动表用不上索引呢?

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
关系型数据库 MySQL
mysql join 实践
mysql join 实践
20 0
|
4月前
|
网络协议 Java 关系型数据库
年薪50W阿里P7架构师必备知识:并发+JVM+多线程+Netty+MySQL
线程基础、线程之间的共享和协作一 线程基础、线程之间的共享和协作二 线程的并发工具类 线程的并发工具类、原子操作CAS 显式锁和AQS一 显式锁和AQS二 并发容器一 并发容器二 并发容器三、线程池一 线程池二、并发安全一
|
3月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云原生数据库 PolarDB MySQL:云原生时代的数据库新篇章
阿里云原生数据库 PolarDB MySQL,它是阿里云自主研发的下一代云原生关系型数据库。PolarDB具有多主多写、多活容灾、HTAP等特性,交易性能和存储容量均表现出色。此外,PolarDB MySQL Serverless具有动态弹性升降资源和全局一致性等特性,能够适应高吞吐写入和高并发业务场景。本文详细分析了PolarDB的性能、稳定性和可扩展性,以及它在成本、性能和稳定性方面的优势。PolarDB为企业提供了高效、可靠的数据库解决方案,是值得考虑的选择。
301 0
|
4月前
|
关系型数据库 MySQL
MySQL left join 查询 多条数据
MySQL left join 查询 多条数据
40 0
|
1月前
|
存储 算法 关系型数据库
MySQL的JOIN到底是怎么玩的
在MySQL中,查询操作通常会涉及到联结不同表格,而JOIN命令则在这一过程中扮演了关键角色。在JOIN操作中,我们通常会使用三种不同的方式,分别是内连接、左连接以及右连接。
|
3月前
|
存储 关系型数据库 MySQL
败给“MySQL”的33天,我重振旗鼓,四面拿下阿里淘系offer
自己投了几家头部互联网公司,阿里是其中之一,也是我的期望公司。既然目标定下来了,自然是要竭尽全力去实现的,年前面试了阿里一波,但最终是败给了MySQL,好几个问题都答得不太理想,所以结果也想象得到,挂得很快。但今年由于疫情的缘故,各大互联网公司也受到了一些阻力,不过也趁着这空闲之际,我重整旗鼓,在败给“MySQL”的第33天,四面拿下了阿里淘系offer!
|
3月前
|
存储 关系型数据库 MySQL
最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)
作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上,MySQL并不难,今天这份最全的MySQL总结,助你向阿里“开炮”,拿下offer没啥问题。
|
4月前
|
关系型数据库 MySQL 数据库
MySQL 数据库操作指南:LIMIT,OFFSET 和 JOIN 的使用
您可以通过使用"LIMIT"语句来限制查询返回的记录数量。以下是一个示例,获取您自己的Python服务器中"customers"表中的前5条记录:
92 1
|
4月前
|
存储 关系型数据库 MySQL
面试阿里(P8)竟被MySQL难倒,奋发图强二次面试斩获阿里offer
牛顿说过“无论做什么事情,只要肯努力奋斗,是没有不成功的”。我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在“我”身上实现了。
|
4月前
|
SQL 关系型数据库 MySQL
完美,阿里DBA骨干团队编写的792页MySQL调优笔记真香
这个世界是由问题组成的,理想的状态和实际状态之间的差异造成了问题。国家领导解决人民生活幸福的大问题,公司的总经理解决盈利的问题,而本书只想解决MySQL数据库性能这么一一个“小问题”。

推荐镜像

更多