首页 > 数据库 >MySQL之join

MySQL之join

时间:2023-08-09 20:55:25浏览次数:47  
标签:... join tb1 tb2 索引 全表 MySQL

语法

  1. ... from tb1 join(inner join) tb2 on condition
  2. ... from tb1 left join tb2 on condition
  3. ... from tb1 right join tb2 on condition
  4. ... from tb1 full join tb2 on condition【1】

阿里巴巴Java开发手册

【强制】 超过三个表禁止join。需要join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。
说明 : 即使双表join也要注意表索引、SQL性能。【2】

为什么对join进行限制?join的过程是怎样的?

现在假设有两个表tb1和tb2,都有字段id、a、b,id为主键,a上有索引,tb1中有100行数据,tb2中有1000行数据。【3】

  1. explain ... tb1 join tb2 on tb1.a = tb2.a会发现tb1是全表扫描,tb2是走的索引,这很好理解相当于两层for,只是第二层可以通过所以找到想找的值。具体过程为依次从tb1中读一行,再去通过索引找tb2中满足条件的行。
  2. explain ... tb1 join tb2 on tb1.a = tb2.b因为没有索引,这就是两层for了,显然时间复杂度是不可接受的,因此MySQL的做法是这样:
    • 将tb1放到join_buffer中(当然这里也可能出现放不下的情况)
    • 全表扫描tb2,然后与join_buffer中的数据进行比较找到满足条件的行(这个专栏其实没有讨论tb2放不下的情况,待补充)。这里举个例子说明一下为什么可以加快速度,假设tb1需要分5次才能放到join_buffer中,对于其中的一次来说,将tb1的1/5放入到join_buffer中,再对tb2全表扫描,接着对比tb1和tb2找到满足条件的行,而这样的操作需要5次才能完成,也就是说tb2有5次的全表扫描,若采用类似于两层for的方式的话需要:5 * join_buffer中的大小(前提是第5次也正好满了),不过就是tb1的行数。因此两种方式对于tb2的全表扫描的次数对比为:tb1需要分的次数 vs tb1的行数,差距是非常大的。

由此可知如果被驱动表condition的字段没有索引的话,会有很大的开销,因此如果在数据量较大的情况下一定要要确保被驱动表中加上索引。

参考

  1. https://www.w3schools.com/sql/sql_join.asp
  2. https://pdai.tech/md/dev-spec/code-style/code-style-alibaba.html
  3. 极客时间MySQL实战45讲,第34、35节

标签:...,join,tb1,tb2,索引,全表,MySQL
From: https://www.cnblogs.com/optimjie/p/17617976.html

相关文章

  • MYSQL数据库知识点
    CONCAT()函数的使用方法--双列合并SELECTCONCAT(id,'@',number2)FROMtable1--多列合并SELECTCONCAT(id,'AA',number,'B',number2)FROMtable1table1的数据以及拼接后的效果  DATE_FORMAT()时间格式化函数 ......
  • MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】
    一.多表联合查询 创建表和数据#多表查询语法select字段1,字段2...from表1,表2...[where条件]注意:如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积#查询人员和部门所有信息select*fromperson,dept笛卡尔乘积公式:A表中数据条数  *......
  • MySQL数据表的损坏及容灾解决方案
    引言在互联网应用中,MySQL是最常用的关系型数据库之一。然而,数据表的损坏可能会导致数据丢失或无法正常访问,给业务运营带来严重影响。本文将讨论MySQL数据表容易损坏的情况,并提供相应的容灾解决方案。数据表容易损坏的情况MySQL数据表在以下情况下容易发生损坏:硬件故障:例如磁盘......
  • mysql查询字段中还有中文的数据
    select*fromwgsf where`机构名称` REGEXP'^[\u4e00-\u9fa5]+$';上述SQL语句的含义是在表wgsf中,查询字段机构名称里纯中文的数据;其中[\u4e00-\u9fa5]代表汉字的Unicode编码范围,^和$表示匹配字符串的开头和结尾,可以确保该字段里的数据是纯中文。eg:在wsgf表中查询 机构名......
  • MySQL 中的锁类型及死锁避免策略
    引言在数据库系统中,锁是一种重要的机制,用来管理并发访问数据的方式。在多个并发读写的事务同时操作数据库时,很容易出现资源争用的情况,这就需要使用锁来控制数据的访问权限,保证数据的一致性和完整性。MySQL是一款广泛使用的关系型数据库管理系统,它提供了多种不同的锁类型,用于不同......
  • 何时使用MongoDB而不是MySql
    什么是MySQL和MongoDBMySQL和MongoDB是两个可用于存储和管理数据的数据库管理系统。MySQL是一个关系数据库系统,以结构化表格格式存储数据。相比之下,MongoDB以更灵活的格式将数据存储为JSON文档。两者都提供性能和可扩展性,但它们为不同的应用场景提供了更好的性能。My......
  • 面试博客:MySQL中的访问控制详解
    引言在当今互联网时代,数据安全是每个企业和个人都必须重视的问题。作为最流行的关系型数据库之一,MySQL提供了强大的访问控制功能,以确保只有授权用户可以访问和操作数据库。本文将深入探讨MySQL中的访问控制机制,并提供一个代码示例来帮助读者更好地理解。什么是访问控制?访问控制......
  • MySQL数据库笔记(一)
    第一章数据库概述1、什么是数据库数据库是一种存储并管理数据的软件系统存储:持久化管理:增删改查常用的存储数据的方式:1、Java中的变量:生命周期短,不能实现持久化[内存]2、序列化:管理数据时依赖于Java中的反序列化[硬盘]3、txt,办公软件:没有统一的方式管理数据[硬盘]4......
  • MySQL和Java中的货币字段类型选择
    引言在互联网应用中,处理货币是一项常见的任务。为了确保准确性和精度,我们需要选择适当的字段类型来存储货币数据。本文将讨论在MySQL和Java中记录货币时应选择的字段类型,并提供相应的代码示例。MySQL中的货币字段类型在MySQL中,我们可以使用DECIMAL数据类型来存储货币数据。DECIM......
  • MySQL中的外键(foreign key)
    [转]https://blog.csdn.net/weiguang102/article/details/126409406 版权声明:本文为CSDN博主「知其黑、受其白」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weiguang102/article/details/126409406......