关于left join优化not in 导致的长时间查询无数据问题 Using where; Using join buffer (Block Nested Loop)

2023-11-16

一、背景

  1. 线上存在业务,需要每天定时整理某个表A未处理的数据,并写入另外一张表B;
  2. 每天查询出不存在B表中且未处理过的A表数据;
  3. A表中的数据主键放入B表中,未设定B表对应索引;
  4. 数据量初始值大概在几千条;
  5. 根据网上书籍介绍及多数网友介绍,left join 优于 not exists 优于 not in,not in不走索引,所以最终选择left join完成该业务;
  6. 数据量大约在10万条数据时,已经无法查询出任何数据;
    在这里插入图片描述

二、测试环境

  1. mysql版本 5.7.30
  2. 数据库建表sql
    	create table test_a(
    		id int(11) primary key,
    		user_name varchar(11)
    	)
    	create table test_b(
    		id int(11),
    		user_name varchar(11)
    	)
    
  3. test_a存在主键索引,test_b表无索引
  4. 插入数据存储过程sql
    	CREATE DEFINER=`root`@`%` PROCEDURE `NewProc`()
    	BEGIN
    	#Routine body goes here...
    	declare id int(11);
    	DECLARE i int(11) DEFAULT 0;
    	DECLARE user_name varchar(11);
    	while i <= 1000000 do
    	 set i = i + 1;
    	 set id = i;
    	 set user_name = CONCAT('test',i);
    	 insert into test_a VALUES (id, user_name);
    	 set i = i + 1;
    	 set id = i;
    	 set user_name = CONCAT('test',i);
    	 insert into test_b VALUES (id, user_name);
    	 end while;
    	 END
    
  5. 保证test_a和test_b各存在id互不相等500001条数据

三、测试结果

left join

  1. 测试sql

    select count(0) from test_a a left join test_b b on a.id = b.id where b.id is null
    

    1.1 测试sql分析
    在这里插入图片描述
    1.2 测试结果
    无结果,数据查询时间过长无响应
    在这里插入图片描述

not exists

  1. 测试sql
    EXPLAIN select count(0) from test_a where not exists (select * from test_b where test_b.id = test_a.id)
    
    2.1 测试sql分析
    在这里插入图片描述
    2.2 测试结果
    无结果,数据查询时间过长无响应
    在这里插入图片描述

not in

  1. 测试sql
    EXPLAIN select count(0) from test_a where id not in (select id from test_b)
    
    3.1 测试sql分析
    在这里插入图片描述
    3.2 测试结果
    唯一一个出数据的,1.190s
    在这里插入图片描述

四、优化处理

  1. 增加test_b 的id索引
    在这里插入图片描述
  2. 查看对应结果
    2.1 left join , 0.596s
    在这里插入图片描述
    在这里插入图片描述
    2.2 not exists , 1.998s
    在这里插入图片描述
    在这里插入图片描述
    2.3 not in , 1.172s
    在这里插入图片描述
    在这里插入图片描述

五、结果分析

  1. 使用left join, not exists优化not in 语句时,必须在存在索引的情况下使用,否则有可能长时间查询无结果;
  2. left join在有索引的情况下对于此类情况优化最明显;
  3. not exists不一定速度快过not in,exists的原理是先查询exists前面表返回的数据,根据数据结果,作为条件与exists后面的查询进行对比(查询一条,对比一条),如果满足后面的条件,则返回真,然后返回数据,否则返回假,无数据,not exists则与之相反。所以not exists快过not in的前提是exists前面的语句对应的表查询返回的数据量必须小于后面的表查询返回的数据量;
  4. not in还是会走索引,至于是否与mysql版本有关,暂时不做论证;
  5. 使用Left join,exists优化 in语句时,必须要小心是否能触发索引,否则得不偿失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于left join优化not in 导致的长时间查询无数据问题 Using where; Using join buffer (Block Nested Loop) 的相关文章

随机推荐

  • LSTM对比Bi-LSTM的电力负荷时间序列预测(Matlab)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 0 概述 1 电力负荷预测 2 滑动窗输入结构的构建 3 LSTM 4 Bi LSTM 5 运行结果 6 Matla
  • jQuery MiniUI 开发教程 树形控件 树形:懒加载树(五)

    b 懒加载树 b img http www miniui com docs api images lazytree gif img 参考示例 url http www miniui com demo tree lazytree html 懒
  • C++:读写INI文件

    C 读写INI文件 INI文件是一种常见的配置文件格式 用于存储应用程序的配置信息 在C 中 我们可以使用一些库来读取和写入INI文件 在本文中 我将向您展示如何使用C 读取和写入INI文件 读取INI文件 对于INI文件的读取 我们可以使
  • Spring Data JPA 多数据源的使用

    p 项目中使用多个数据源在以往工作中比较常见 微服务架构中不建议一个项目使用多个数据源 在微服务架构下 一个微服务拥有自己独立的一个数据库 如果此微服务要使用其他数据库的数据 需要调用对应库的微服务接口来调用 而不是在一个项目中连接使用多个
  • U盘安装redhat 7.4的最终解决方案

    U盘安装redhat 7 4的最终解决方案 终于将redhat 7 4装上x3650 M5服务器了 过程无比艰辛 因为与CentOS7有一定区别 与redhat6 8完全不同 遇到的问题有 A 刻录镜像的时候只能刻录一个4MB EFI文件夹
  • 详解TCP为什么不能是两次握手

    三次握手的过程 注意不要遗漏全双工下两缓存 读 写缓存 的分配和变量的分配 CLOSED 表示初始状态 LISTEN 该状态表示服务器端的某个SOCKET处于监听状态 可以接受连接 SYN SENT 这个状态与SYN RCVD遥相呼应 当客
  • 【golang】for range中取地址操作的陷阱

    Tips for range创建了每个元素的副本 而不是直接返回每个元素的引用 例子1 package main import fmt func main slice int 0 1 2 3 myMap make map int int f
  • ZooKeeper之Java客户端API使用—创建节点。

    客户端可以通过ZooKeeper的API来创建一个数据节点 有如下两个接口 String create final String path byte data List
  • LeetCode-1604. 警告一小时内使用相同员工卡大于等于三次的人【哈希表,排序,数组】

    LeetCode 1604 警告一小时内使用相同员工卡大于等于三次的人 哈希表 排序 数组 题目描述 解题思路一 时间转换成分钟数 直接解决跨天问题 用哈希表记录每个员工的名字以及对应的时间 然后遍历哈希表 对于每个员工 我们将该员工的所有
  • 跟我学Java设计模式第7天:行为型设计模式

    Java设计模式文章目录 跟我学Java设计模式第一天 设计模式概述和软件设计原则 跟我学Java设计模式第二天 简单工厂模式 工厂方法模式 抽象工厂模式 跟我学Java设计模式第三天 代理模式 适配器 装饰者等其中模式结构 跟我学Java
  • Qt安装(Windows平台)

    Qt 的安装组件分为两部分 一部分是 Qt 5 9 分类下的 该分类包含的是真正的 Qt 开发库组件 另一部分是 Tools 分类下的 该分类包含的是集成开发环境和编译工具 Qt 5 9 分类下的开发组件 组件 说明 MinGW 5 3 0
  • 【elementplus】解决el-table设置固定高度后,横向滚动条消失的问题

    消失的原因 因为我给el scrollbar bar设置了position static 覆盖了它原本的样式position absolute 解决 把position static删掉
  • hbase region 分配方式

    参与 Region 分配的重要对象 在 Region 分配过程当中 起着重要做用有以下一些对象 安全 HMaster 是 HBase 中的 Master server 仅有一个 HRegionServer 负责多个 HRegion 使之能向
  • Java调用ffmpeg进行视频.H264抽帧,并保存为图片

    Java调用ffmpeg进行视频 H264抽帧 并保存为图片 1 需求 2 解决 3 源码 参考 1 需求 对视频 D data 01 test H264进行抽帧并保存为图片 图片命名为1 jpg 2 jpg 图片保存在D data 01
  • 【华为OD机试】找朋友(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 在学校中 N个小朋友站成一队 第i个小朋友的身高为height i 第i个小朋友可以看到的第
  • 【第六期】人工智能工程师培养计划招生

    前 言 学院第四期课程在2019年10月结课 第一至第四期具有求职意向的同学中 目前已经有80 的同学拿到了国内外名企的AI算法岗位offer 或者国外名校的AI 硕士 全奖博士录取 offer 在大家的认可下 我们开始了第六期的课程 在本
  • (九)kaldi thchs30 三音子模型(line 71-76)

    概览 首先放代码 triphone steps train deltas sh boost silence 1 25 cmd train cmd 2000 10000 data mfcc train data lang exp mono a
  • netty http文件服务器,Netty充当Http服务器简单示例

    Netty的应用场景 RPC 通信框架 长连接服务器 Http服务器 充当Http服务器实例 用户向服务器发送请求 服务器返回给用户Hello World 先介绍几个基础的概念 Channel 通道 相当于一个连接 ChannelHandl
  • Linux TC(Traffic Control) 简介(一)

    众所周知 在互联网诞生之初都是各个高校和科研机构相互通讯 并没有网络流量控制方面的考虑和设计 IP协议的原则是尽可能好地为所有数据流服务 不同的数据流之间是平等的 然而多年的实践表明 这种原则并不是最理想的 有些数据流应该得到特别的照顾 比
  • 关于left join优化not in 导致的长时间查询无数据问题 Using where; Using join buffer (Block Nested Loop)

    一 背景 线上存在业务 需要每天定时整理某个表A未处理的数据 并写入另外一张表B 每天查询出不存在B表中且未处理过的A表数据 A表中的数据主键放入B表中 未设定B表对应索引 数据量初始值大概在几千条 根据网上书籍介绍及多数网友介绍 left