iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中怎么实现多表join
  • 450
分享到

MySQL中怎么实现多表join

2024-04-02 19:04:59 450人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关Mysql中怎么实现多表join,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Join并行Join并行1. 多表join介绍2.

这篇文章将为大家详细讲解有关Mysql中怎么实现多表join,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Join并行

Join并行1. 多表join介绍2. 多表Join的方式不使用Join buffer使用Join buffer3. Join执行流程(老执行器)

1. 多表join介绍

JOIN子句用于根据两个或多个表之间的相关列来组合它们。 例如:

Orders:

MySQL中怎么实现多表join

Customers:

MySQL中怎么实现多表join

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate  FROM Orders  INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

MySQL中怎么实现多表join

2. 多表Join的方式

Hash join使用新执行器实现,在这里不做讨论

mysql支持的都是Nested-Loop Join,以及它的变种。

不使用Join buffer

a) Simple Nested-Loop

对r表的每一行,完整扫描s表,根据r[i]-s[i]组成的行去判断是否满足条件,并返回满足条件的结果给客户端。

MySQL中怎么实现多表join

mysql> show create table t1;  +-------+----------------------------------------------------------------------------------------------------------------+  | Table | Create Table                                                                                                   |  +-------+----------------------------------------------------------------------------------------------------------------+  | t1    | CREATE TABLE `t1` (   `id` int(11) NOT NULL  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |  +-------+----------------------------------------------------------------------------------------------------------------+  1 row in set (0.00 sec)  mysql> show create table t3;  +-------+--------------------------------------------------------------------------------------------------------------------+  | Table | Create Table                                                                                                       |  +-------+--------------------------------------------------------------------------------------------------------------------+  | t3    | CREATE TABLE `t3` (   `id` int(11) DEFAULT NULL  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |  +-------+--------------------------------------------------------------------------------------------------------------------+  1 row in set (0.00 sec)  mysql> explain select  * from t1, t3 where t1.id = t3.id;  +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+  | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |  +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+  |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL        |  |  1 | SIMPLE      | t3    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |    50.00 | Using where |  +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+  2 rows in set, 1 warning (0.00 sec)

b) Index Nested-Loop

对r表的每一行,先根据连接条件去查询s表索引,然后回表查到匹配的数据,并返回满足条件的结果给客户端。

MySQL中怎么实现多表join

mysql> show create table t2;  +-------+---------------------------------------------------------------------------------------------------------------------------------------+  | Table | Create Table                                                                                                                          |  +-------+---------------------------------------------------------------------------------------------------------------------------------------+  | t2    | CREATE TABLE `t2` (   `id` int(11) NOT NULL,   KEY `index1` (`id`)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |  +-------+---------------------------------------------------------------------------------------------------------------------------------------+  1 row in set (0.00 sec)  mysql> explain select * from t1, t2 where t1.id = t2.id;  +----+-------------+-------+------------+------+---------------+--------+---------+------------+------+----------+-------------+  | id | select_type | table | partitions | type | possible_keys | key    | key_len | ref        | rows | filtered | Extra       |  +----+-------------+-------+------------+------+---------------+--------+---------+------------+------+----------+-------------+  |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL   | NULL    | NULL       |    2 |   100.00 | NULL        |  |  1 | SIMPLE      | t2    | NULL       | ref  | index1        | index1 | 4       | test.t1.id |    1 |   100.00 | Using index |  +----+-------------+-------+------------+------+---------------+--------+---------+------------+------+----------+-------------+  2 rows in set, 1 warning (0.00 sec)

使用Join buffer

a) Block Nested Loop

MySQL中怎么实现多表join

从r表读取一部分数据到join cache中,当r表数据读完或者join cache满后,做join操作。

JOIN_CACHE_BNL::join_matching_records(){   do {     //读取s表的每一行     qep_tab->table()->file->position(qep_tab->table()->record[0]);     //针对s的每一行,遍历join buffer     for(each record in join buffer) {       get_record();       rc = generate_full_extensions(get_curr_rec());       //如果不符合条件,直接返回       if (rc != NESTED_LOOP_OK) return rc;     }   } while(!(error = iterator->Read()))  }
mysql> explain select  * from t1, t3 where t1.id = t3.id;  +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+  | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |  +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+  |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                               |  |  1 | SIMPLE      | t3    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |    50.00 | Using where; Using join buffer (Block Nested Loop) |  +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+  2 rows in set, 1 warning (0.00 sec)

b) Batched Key Access

MySQL中怎么实现多表join

从r表读取一部分数据到join cache中,s表中记录r表被连接的列的值作为索引,查询所有符合条件的索引,然后将这些符合条件的索引排序,然后统一回表查询记录。

其中,对于每一个cached record,都会有一个key,通过这个key去s表扫描所需的数据。

dsmrr_fill_buffer(){   while((rowids_buf_cur < rowids_buf_end) &&         !(res = h3->handler::multi_range_read_next(&range_info))){     //下压的index条件     if (h3->mrr_funcs.skip_index_tuple &&         h3->mrr_funcs.skip_index_tuple(h3->mrr_iter, curr_range->ptr))       continue;     memcpy(rowids_buf_cur, h3->ref, h3->ref_length);   }   varlen_sort(       rowids_buf, rowids_buf_cur, elem_size,       [this](const uchar *a, const uchar *b) { return h->cmp_ref(a, b) < 0; });  }  dsmrr_next(){   do{     if (rowids_buf_cur == rowids_buf_last) {       dsmrr_fill_buffer();     }     // first match     if (h3->mrr_funcs.skip_record &&         h3->mrr_funcs.skip_record(h3->mrr_iter, (char *)cur_range_info, rowid))       continue;     res = h->ha_rnd_pos(table->record[0], rowid);     break;   } while(true);  }  JOIN_CACHE_BKA::join_matching_records(){   while (!(error = file->ha_multi_range_read_next((char **)&rec_ptr))) {     get_record_by_pos(rec_ptr);     rc = generate_full_extensions(rec_ptr);       if (rc != NESTED_LOOP_OK) return rc;   }  }
mysql> show create table t1;  +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+  | Table | Create Table                                                                                                                                    |  +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+  | t1    | CREATE TABLE `t1` (   `f1` int(11) DEFAULT NULL,  `f2` int(11) DEFAULT NULL  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |  +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+  1 row in set (0.00 sec)  mysql> show create table t2;  +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table                                                                                                                                                                                | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t2    | CREATE TABLE `t2` (   `f1` int(11) NOT NULL,   `f2` int(11) NOT NULL,   `f3` char(200) DEFAULT NULL,   KEY `f1` (`f1`,`f2`)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |  +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)  mysql> explain SELECT  t2.f1, t2.f2, t2.f3 FROM t1,t2 WHERE t1.f1=t2.f1 AND t2.f2 BETWEEN t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1;  +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref         | rows | filtered | Extra                                                      | +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------------------------------------+ |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL        |    3 |   100.00 | Using where                                                   | |  1 | SIMPLE      | t2    | NULL       | ref  | f1            | f1   | 4       | test1.t1.f1 |    7 |    11.11 | Using index condition; Using join buffer (Batched Key Access) | +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------------------------------------+ 2 rows in set, 1 warning (0.00 sec)

c) Batched Key Access(unique)

与Batched Key Access不同的是,r中的列是s的唯一索引,在r记录写入join cache的时候,会记录一个key的hash table,仅针对不同的key去s表中查询。(疑问,为什么只有unique的时候才能用这种方式?不是unique的话,s表中可能会扫描出多条数据,也可以用这种方式去处理,减少s表的重复扫描)。

JOIN_CACHE_BKA_UNIQUE::join_matching_records(){   while (!(error = file->ha_multi_range_read_next((char **)&key_chain_ptr))) {     do(each record in chain){       get_record_by_pos(rec_ptr);       rc = generate_full_extensions(rec_ptr);         if (rc != NESTED_LOOP_OK) return rc;       }   }  }
mysql> show create table city;  +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table                                                                                                                                                                                                                                                                                                                                       | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | city  | CREATE TABLE `city` (   `ID` int(11) NOT NULL AUTO_INCREMENT,   `Name` char(35) NOT NULL DEFAULT '',   `Country` char(3) NOT NULL DEFAULT '',   `Population` int(11) NOT NULL DEFAULT '0',   PRIMARY KEY (`ID`),   KEY `Population` (`Population`),   KEY `Country` (`Country`)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |  +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)  mysql> show create table country;  +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table   | Create Table                                                                                                                                                                                                                                                                                                                                                   | +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | country | CREATE TABLE `country` (   `Code` char(3) NOT NULL DEFAULT '',   `Name` char(52) NOT NULL DEFAULT '',   `SurfaceArea` float(10,2) NOT NULL DEFAULT '0.00',   `Population` int(11) NOT NULL DEFAULT '0',   `Capital` int(11) DEFAULT NULL,   PRIMARY KEY (`Code`),   UNIQUE KEY `Name` (`Name`)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |  +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec)  mysql> EXPLAIN SELECT city.Name, country.Name FROM city,country WHERE city.country=country.Code AND  country.Name LIKE 'L%' AND city.Population > 100000; +----+-------------+---------+------------+-------+--------------------+---------+---------+--------------------+------+----------+--------------------------------------------------------------+ | id | select_type | table   | partitions | type  | possible_keys      | key     | key_len | ref                | rows | filtered | Extra                                                        | +----+-------------+---------+------------+-------+--------------------+---------+---------+--------------------+------+----------+--------------------------------------------------------------+ |  1 | SIMPLE      | country | NULL       | index | PRIMARY,Name       | Name    | 208     | NULL               |    1 |   100.00 | Using where; Using index                                     | |  1 | SIMPLE      | city    | NULL       | ref   | Population,Country | Country | 12      | test1.country.Code |    1 |   100.00 | Using where; Using join buffer (Batched Key Access (unique)) | +----+-------------+---------+------------+-------+--------------------+---------+---------+--------------------+------+----------+--------------------------------------------------------------+ 2 rows in set, 1 warning (0.01 sec)

3. Join执行流程(老执行器)

MySQL中怎么实现多表join

sub_select <--------------------------------------------+   | -> iterator::read() // 读一行数据                    |   | -> evaluate_join_record()  //检查这行数据是否符合条件 |   | -> next_select() ---+                               |                         |                               |  sub_select_op  <--------+                               |   | -> op->put_record() // 前表数据写入join cache        |     | -> put_record_in_cache()                          |     | -> join->record()                                 |       | -> join_matching_records()                      |         | -> (qep_tab->next_select)(join, qep_tab + 1, 0) // 继续调用next_select     | -> end_send()

关于MySQL中怎么实现多表join就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中怎么实现多表join

本文链接: https://www.lsjlt.com/news/57835.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中怎么实现多表join
    这篇文章将为大家详细讲解有关MySQL中怎么实现多表join,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Join并行Join并行1. 多表join介绍2....
    99+
    2024-04-02
  • mybatis-plus多表联查join的实现
    目录1、安装依赖2、定义三个基本实体类3、定义三个mapper4、定义返回值dto5、开发业务层6、假如进行分页查询的话7、注意:8、其他9、如果针对条件进行动态查询1、安装依赖 &...
    99+
    2023-01-11
    mybatis-plus多表联查 mybatis-plus多表联查join
  • 【MySQL】多表查询(JOIN / UNION)
    文章目录 多表查询1. 笛卡尔积错误2. 等值连接 WHERE3. 非等值连接4. 自连接5. 内连接 INNER JOIN6. 外连接 LEFT JOIN7. 合并查询 UNIO&#...
    99+
    2023-09-04
    mysql 数据库 sql
  • mysql怎么实现多表查询
    这篇文章给大家分享的是有关mysql怎么实现多表查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、说明查询其实就是对于对于各个表格进行递归调用,和矩阵的乘法一样一样的,这个对应非常直观,也非常通用。常规的查询...
    99+
    2023-06-15
  • mysql中怎么实现多表连接查询
    这篇文章将为大家详细讲解有关mysql中怎么实现多表连接查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下:SELECT FId ...
    99+
    2024-04-02
  • MySQL中怎么实现多表删除操作
    本篇文章为大家展示了MySQL中怎么实现多表删除操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  1、从MySQL数据表t1中把那些id值在数据表t2里有匹配的...
    99+
    2024-04-02
  • MySQL中怎么实现多表查询功能
    今天就跟大家聊聊有关MySQL中怎么实现多表查询功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、查看第一个表 mytable 的内容:   m...
    99+
    2024-04-02
  • MySQL怎么实现跨库join查询
    这篇文章主要介绍了MySQL怎么实现跨库join查询的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL怎么实现跨库join查询文章都会有所收获,下面我们一起来看看吧。MySQL实现跨库join查询同服务器...
    99+
    2023-07-05
  • 怎么在mysql中实现多表关联统计
    本篇文章为大家展示了怎么在mysql中实现多表关联统计,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。需求:统计每本书打赏金额,不同时间的充值数据统计,消费统计,设计...
    99+
    2024-04-02
  • MySQL中JOIN怎么用
    小编给大家分享一下MySQL中JOIN怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介A的独有+AB的公有B的独有+AB的公有AB的公有A的独有B的独有A...
    99+
    2023-06-29
  • MySQL多表查询内连接外连接详解,join、left join、right join、full join的使用
    目录 1、多表查询概览 1.1、分类 1.2、外连接的分类 1.3、常用的SQL语法标准 2、内外联接案例 2.1、初始化表 2.2、内连接 2.3、外连接案例 2.4、全连接案例 2.5、union和union all...
    99+
    2023-09-02
    mysql 数据库 java
  • 如何在MySQL中使用JOIN来连接多个表格
    在MySQL中,您可以使用JOIN语句来连接多个表格。以下是一个简单的例子: 假设我们有两个表格,一个是用户表(users),另一个...
    99+
    2024-03-06
    MySQL
  • 利用HDFS怎么实现多文件Join操作
    本篇文章为大家展示了利用HDFS怎么实现多文件Join操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。详解HDFS多文件Join操作的实例最近在做HDFS文件处理之时,遇到了多文件Join操作,其...
    99+
    2023-05-31
    hdfs join
  • MySQL数据库查询中怎么实现多表查询
    今天小编给大家分享一下MySQL数据库查询中怎么实现多表查询的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、多表查询多表查...
    99+
    2023-06-29
  • MySQL中怎么实现单表多字段模糊查询
    今天就跟大家聊聊有关MySQL中怎么实现单表多字段模糊查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  如何实现MySQL单表多字段模糊查询  ...
    99+
    2024-04-02
  • linq中怎么实现多表查询
    这篇文章给大家介绍linq中怎么实现多表查询,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1:1关系的多表操作表结构如上首先是测试取全记录的情况(也就是取所有字段)linq多表查询之直接写表达式var use...
    99+
    2023-06-17
  • Linq怎么实现Left join
    今天就跟大家聊聊有关Linq怎么实现Left join,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在linq中没有 left join,所以当希望用到时,会比较范难。以下是linq...
    99+
    2023-06-17
  • MySQL中怎么实现分区表
    MySQL中怎么实现分区表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。   MySQL分区的建立 MySQL可以建立四种分区...
    99+
    2024-04-02
  • 怎么在Mysql中利用update实现多表联合更新
    今天就跟大家聊聊有关怎么在Mysql中利用update实现多表联合更新,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 执行 UPDATE stu...
    99+
    2024-04-02
  • mysql中join和on怎么用
    小编给大家分享一下mysql中join和on怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作