前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL--什么情况下不建议使用join查询

MySQL--什么情况下不建议使用join查询

作者头像
关忆北.
发布2023-10-11 09:35:39
2500
发布2023-10-11 09:35:39
举报
文章被收录于专栏:关忆北.
关于join

当需要查询两个表的交集、并集等数据时,除了嵌套子查询的方式外,还可以使用join的方式提升性能。对于MySQL的join语句,需要两个最基础的“角色”:主表即驱动表,关联表即驱动表。join描述的就是驱动表与被驱动表的关联关系。MySQL有三种关联逻辑处理策略,分别为:Index Nested-Loop JoinSimple Nested-Loop JoinBlock Nested-Loop Join。在编写SQL时,需要配合explain使语句选择性能最优的策略。

Index Nested-Loop Join

索引嵌套循环连接,MySQL选择驱动表与被驱动表关联逻辑之一。

当使用该策略时,MySQL的执行流程为:

  1. 从驱动表中读入一行数据 R;
  2. 从数据行 R 中,取出 a 字段到被驱动表里去查找;
  3. 取出被驱动表中满足条件的行,跟 R 组成一行,作为结果集的一部分;
  4. 重复执行步骤 1 到 3,直到驱动表的末尾循环结束。
什么情况下MySQL会选择Index Nested-Loop Join?

当驱动表关联被驱动表的字段上具有索引时,会使用本策略。在本策略中,驱动表在where条件筛选完毕后,会扫描全表,被驱动表走索引的树搜索。 假设被驱动表共N行数据,对于Index Nested-Loop Join来说,在查询被驱动表的数据时,会使用二分法进行查找,即时间复杂度为:O(logN),由于每次在被驱动表查一行数据,要先搜索索引再回表搜索,假设驱动表行数是N,执行整个过程复杂度近似:N+N*2*log2M

Simple Nested-Loop Join

当被驱动表无可用索引时,在驱动表得到一行数据后,需要拿着该数据去被驱动表扫描全表逐行匹配数据,假设驱动表有N行数据,被驱动表有M行数据,那么扫描总行数则为:N*M行。如果驱动表与被驱动表均有十万行数据,则需要扫描100亿行。

当然,MySQL 也没有使用这个Simple Nested-Loop Join算法,而是使用了另一个叫作“Block Nested-Loop Join”的算法,简称 BNL

Block Nested-Loop Join

当被驱动表无可用索引时,算法流程为:

  1. 把驱动表的数据读入线程内存join_buffer中
  2. 扫描被驱动表,把被驱动表的每一行取出来,跟join_buffer中的数据做对比,满足join条件的,作为结果集的一部分返回。

图片引用自极客时间《MySQL实战45讲》。

能不能使用join语句?
  1. 如果可以使用 Index Nested-Loop Join 算法,也就是说可以用上被驱动表上的索引,其实是没问题的;
  2. 如果使用 Block Nested-Loop Join 算法,扫描行数就会过多。尤其是在大表上的 join 操作,这样可能要扫描被驱动表很多次,会占用大量的系统资源。所以这种 join 尽量不要用。

所以你在判断要不要使用 join 语句时,就是看 explain 结果里面,Extra 字段里面有没有出现“Block Nested Loop”字样。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于join
  • Index Nested-Loop Join
    • 什么情况下MySQL会选择Index Nested-Loop Join?
    • Simple Nested-Loop Join
    • Block Nested-Loop Join
      • 能不能使用join语句?
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档