我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL关联查询优化实现方法详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL关联查询优化实现方法详解

我们准备如下两个表,并插入数据。

#分类
CREATE TABLE IF NOT EXISTS `type` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
);
#图书
CREATE TABLE IF NOT EXISTS `book` (
`bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`bookid`)
);

左外连接

首先我们分析SQL如下,type为驱动表(内表),book为被驱动表(外表)。

EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

每次从type中获取一条数据然后后book中的数据进行对比(全表扫描),这个过程要要重复20次(type 表有20条数据)。

这里可以看到,type均为all。另外还可以看到mysql帮我们做了一个优化,使用了join buffer进行缓存。

我们为被驱动表 book.card 添加索引优化

CREATE INDEX Y ON book(card);
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

这里能够看到,虽然type表仍旧是要处理20次,但是拿着type的数据去book中寻找时,走的是索引。对于B+树来讲,其时间复杂度为logN,相比前面的全表扫描要快很多。

也就是对于左外连接来讲,如果只能添加一个索引,那么一定添加到被驱动表上。

当然,给type的card页创建索引也是可以的。

CREATE INDEX X ON `type`(card);
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

如果索引只加在了驱动表(左表)呢?

DROP INDEX Y ON book;
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

可以看到,同样使用了join buffer。而对于驱动表来讲,即使用到了索引也要做一个整体的遍历(无非这时走的是索引文件)。而被驱动表没有索引,那么性能会相对较慢。

如下图所示,从其查询成本我们也可以看到显著区别。

MySQL关联查询优化实现方法详解

结论: 左(外)连接时,索引加在右表的连接字段。left join用于确定如何从右表搜索行,左表一定都有。同理,右(外)连接时,索引创建在左表的连接字段。该连接字段在两个表中的数据类型保持一致。

此外,从上面Using where; Using join buffer (block Nested Loop)我们也可以想到,如果有条件,那么join buffer给一个较大的容量是有助于提升性能的。

内连接INNER JOIN

我们去掉索引,然后查看执行计划。

DROP INDEX X ON `type`;
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

我们给被驱动表 book.card 添加索引

CREATE INDEX Y ON book(card);
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

我们再给驱动表type添加索引

CREATE INDEX X ON `type`(card);
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

可以看到这里二者均用到了索引。需要说明的是,这时type和book上下次序可能转换,也就是说 对于inner join来讲,查询优化器可以决定谁作为驱动表,谁作为被驱动表出现的 。

那如果book.card没有索引,type.card 有索引呢?

DROP INDEX Y ON book;
EXPLAIN  SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

可以看到book作为了驱动表,type作为了被驱动表。即,对于内连接来讲,如果表的连接条件中只能有一个字段有索引,则有索引的字段所在的表会被作为被驱动表出现。

如果两个表数据量不一致呢?比如这里我们type为40条,book为20条。

EXPLAIN  SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

MySQL关联查询优化实现方法详解

结论: 对于内连接来说,在两个表的连接条件都存在索引的情况下,会选择小表作为驱动表,即“小表驱动大表”。

到此这篇关于MySQL关联查询优化实现方法详解的文章就介绍到这了,更多相关MySQL关联查询优化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL关联查询优化实现方法详解

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

下载Word文档

猜你喜欢

Mysql查询优化之IN子查询优化方法详解

这篇文章主要给大家介绍了关于Mysql查询优化之IN子查询优化的相关资料,需要的朋友可以参考下
2023-02-09

详解MySQL 联合查询优化机制

MySQL 联合查询执行策略。以一个 UNION 查询为例,MySQL 执行 UNION 查询时,会把他们当做一系列的单个查询语句,然后把对应的结果放入到临时表中,最终再读出来返回。在 MySQL中,每个独立的查询都是一个联合查询,从临时表
2022-05-25

mysql多表关联查询优化的方法是什么

在优化MySQL多表关联查询时,可以采取以下方法:确保表中的相关字段有索引:在进行多表关联查询时,通常会使用到相关字段进行连接操作,因此需要确保这些字段在每个表中都有索引。通过为这些字段创建索引可以提高查询的性能。使用合适的连接方式:在多表
mysql多表关联查询优化的方法是什么
2024-04-09

MyBatis自定义映射关系和关联查询实现方法详解

这篇文章主要介绍了MyBatis自定义映射关系和关联查询实现方法,当POJO属性名与数据库列名不一致时,需要自定义实体类和结果集的映射关系,在MyBatis注解开发中,使用@Results定义并使用自定义映射,使用@ResultMap使用自定义映射
2023-05-15

关于MySQL查询语句的优化详解

目录mysql 优化子查询优化待排序的分页查询的优化给排序字段添加索引给排序字段跟 select 字段添加复合索引给排序字段加索引 + 手动回表解决办法排序优化MySQL 优化子查询优化将子查询改变为表连接,尤其是在子查询的结果集较大的
2023-04-20

MySQL JOIN关联查询的原理及优化

目录1 关联查询的执行2 没有索引的算法1 关联查询的执行关联查询的执行过程是:先遍历关联表t1(驱动表,全表扫描),然后根据从表t1中取出的每行数据中的a值,去表t2(被关联表,被驱动表)中查找满足条件的记录,可以走t2的索引搜索。在形
2022-08-22

MySQL,优化查询的方法

对于数据库,优化查询的方法1.使用索引  使用索引时,应尽量避免全表扫描,首先应考虑在 where 及 order by ,group by 涉及的列上建立索引。2.优化SQL语句 1)分析查询语句:通过对查询语句的分析,可以了解查询语句执行情况,找出查询语句
MySQL,优化查询的方法
2017-10-28

MySQLorderby与groupby查询优化实现详解

orderby子句尽量使用index方式排序(即usingindex),避免使用filesort方式排序(即usingfilesort)。Index方式效率高,它指MySQL扫描索引本身完成排序,filesort则效率低
2022-11-13

mysql dblink跨库关联查询的实现

目录1、解决方案2、操作3、缺点1、解决方案mysql是不支持跨库连接的,如果我们实在要连接的话可以用dblink方式。解释:dblink就是我们在创建表的时候连接到我们的远程库,然后我们本地新建的表数据就是映射远程的表的数据。当我们创
2023-02-27

MyBatis 多表联合查询及优化方法

大家都知道Hibernate是全自动的数据库持久层框架,它可以通过实体来映射数据库,通过设置一对多、多对一、一对一、多对多的关联来实现联合查询,接下来通过本文给大家介绍MyBatis 多表联合查询及优化,需要的朋友可以参考下
2022-11-13

编程热搜

目录