Mysql 关于not exists一例
场景:
业务上需要做一个查询,因为是Web及时响应,所以对响应时间有要求,原业务场景是需要从无库存订单中剔除绑定闲置库存,因单条sql查询实现复杂,故考虑用差集方式:
select a.col1, a.col2
from a
where a.id = ?
and not exists (
select b.id
from b left join c on b.id = c.id
where b.id = ?
and b.id = a.id)
order by a.id
数据量: a,b,c皆在百万数据量级,排除其他非必要过滤字段,id皆有btree索引
运行:2s左右
环境:阿里云(最基本线上服务性能,数据库运行状态保持在10个以上链接)
分析:
原sql其实用的是not in,参考了文章1,在同等数据量时not in 会走多次全表查询(因为!=无对应索引),而not exists会走子查询索引,所以not exists更快。故先用not exists替换了not in(语法有差异,替换时需要做b.id = a.id的关联)。在参考文章2以后,尝试用left join进行优化(其中关于mysql子查询优化器说法待考量,后分析文章3),改成如下方式:
select a.col1, a.col2
from a
left join ( select b.id
from b left join c on b.id = c.id
where b.id = ?
) as r on a.id = r.id
where b.id = ?
and r.id is null
order by a.id
思路便是先将子查询符合的行通过left join查询到,然后通过is null条件得到剩下的部分(即满足需求的记录)。最终运行时间在0.7s。
ref:
1. https://www.cnblogs.com/beijingstruggle/p/5885137.html
2. https://blog.csdn.net/zyz511919766/article/details/49335647
3. https://www.cnblogs.com/wxw16/p/6105624.html?utm_source=itdadao&utm_medium=referral
Mysql 关于not exists一例的更多相关文章
- mysql中关于exists的深入讲解
mysql中关于exists的讲解 我认为exists语法是mysql中一个很强大的工具,可以简单地实现某些复杂的数据处理. 下面我谈谈与exists有关的三个方面. all 与 any 首先,看到了 ...
- MySQL 子查询 EXISTS 和 NOT EXISTS(转)
MySQL EXISTS 和 NOT EXISTS 子查询 MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT ... FROM table WHERE EXISTS ...
- mysql+mycat压力测试一例【转】
前言 有很多人担心生产系统上新东西的程序怕压力跟不上和稳定性不行,是的,大家都怕,所以领导要求做一次压力测试,我个人也觉得是有必要的. 如果按原理来说,mycat如果不做分片,纯粹只是代理的话,他所做 ...
- mysql in与exists区别
1.exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(尽量用小表),故内表大的 ...
- MySQL Execution Plan--NOT EXISTS子查询优化
在很多业务场景中,会使用NOT EXISTS语句来确保返回数据不存在于特定集合,部分场景下NOT EXISTS语句性能较差,网上甚至存在谣言"NOT EXISTS无法走索引". 首 ...
- JDBC连接MySQL数据库及演示样例
JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...
- MySQL 子查询 EXISTS 和 NOT EXISTS
MySQL EXISTS 和 NOT EXISTS 子查询 MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT ... FROM table WHERE EXISTS ...
- MySQL优化--NOT EXISTS和LEFT JOIN方式差异
在MySQL中,我们可以将NOT EXISTS语句转换为LEFT JOIN语句来进行优化,哪为什么会有性能提升呢? 使用NOT EXISTS方式SQL为: ) FROM t_monitor m WHE ...
- mysql子查询 exists,not exists,all和any
(1)实现让结果集A - 结果集B:--利用not exists,合并则可用union . exists,not exists:用于判断且获取结果集A是否存在地结果集B中! ==========结果集 ...
随机推荐
- Telnet远程重启路由器TP-LINK
突然断网,以前房东的路由器管理页面可以打开,今天突然间就打不开了.ping了下,可以ping通,于是就想起了房东的路由器是TP-LINK的 可以 telnet登陆的.每次,断网,我都会重启房东的路由器 ...
- phpmyadmin不允许一个表创建多个主键的解决办法
在phpmyadmin中执行建表语句 CREATE TABLE `user3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(2 ...
- 查看ms SQL Server存储过程,函数的内容
方法1:最简单的,右键单击要查看的存储过程,选择“修改”: 方法2: SELECT definition FROM solar.sys.sql_modules WHERE [object_id]=(O ...
- 正则,以“this.Name”开头,以“;”结尾
string regex="this\\.Name(.*?);"; string regex="this\\.Name(.*?);"; 以size开头,以数字结 ...
- X.509证书的编码及解析:程序解析以及winhex模板解析
一.证书的整体结构:证书内容.签名算法.签名结果. 用ASN.1语法描述如下: Certificate::=SEQUENCE{ tbsCertificate TBSCertificate, signa ...
- TF54000: 由于服务器时钟设置可能不正确,无法更新数据解决方案(补充)
此问题出现的原因: 服务器时间比本地时间大.由于TFS源代码的Source Control会根据签入时间做判断.如果后续签入的时间小于变更集的最新版本的时间,就会报错误“TF54000”,并拒绝签入. ...
- tomcat启动时SessionIdGeneratorBase.createSecureRandom耗时5分钟的问题
通常情况下,tomcat启动只要2~3秒钟,突然有一天,tomcat启动非常慢,要花5~6分钟,查了很久,终于在这篇文章找到了解决方案,博主牛人啊. 原文参见:http://blog.csdn.net ...
- 0001_mysql 5.7.25安装初始化
一. 下载mysql https://dev.mysql.com/downloads/mysql/ 二. 选择社区版本 三. 选择版本下载: 四. 跳过注册直接下载: 五. 解压后 ...
- js 按字段分组
var data = [{"id":"32b80b76-a81e-4545-8065-1e7c57180801","userId":&quo ...
- JAVA中方法和变量在继承中的覆盖和隐藏(一)
我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊 ...