Mysql 中 not in 的查询优化
本文为博主原创,转载请注明出处:
最近做性能优化时,通过开启 MySQL 的慢日志查询配置,发现 有一条慢sql,在这里记录下分析和优化的过程。
该慢 sql 如下:
select id from fucdn_customer_domain where id not in (
select customer_domain_id from fucdn_customer_domain_cache where cache_time > 0
) and status = 1
通过 explain 或 desc 查看该sql 的执行计划:

可以看出这条sql 的执行计划分为两步。第一步先执行 fucdn_customer_domain_cache 这张表的子查询,这张表查询结束后再进行外层的查询,且访问类型均为 ALL,所以导致该sql 执行耗时较长。
使用 left join 进行关联优化,将sql 中的子查询,优化为左连接,即减少 sql 执行嵌套的层数,优化后的sql 如下:
select id from fucdn_customer_domain fcd LEFT JOIN (
select customer_domain_id from fucdn_customer_domain_cache where cache_time > 0
) t on fcd.id = t.customer_domain_id where fcd.status = 1 and t.customer_domain_id is null
查看优化后的sql 执行计划:

优化后 id 都变为了1,且过滤的数量比not in 时少了很多。由于本地数据库数据量比较少, 优化后效果并不明显,当拿到 压测环境或现网环境时,性能提高了至少一半以上。
Mysql 中 not in 的查询优化的更多相关文章
- mysql中min和max查询优化
		mysql max() 函数的需扫描where条件过滤后的所有行: 在测试环境中重现: 测试版本:Server version: 5.1.58-log MySQL Community ... 
- 【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)
		原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_ ... 
- mysql中的sql查询优化
		1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进 ... 
- MySQL中的两种临时表
		MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ... 
- MySQL 中NULL和空值的区别 (转载  http://blog.sina.com.cn/s/blog_3f2a82610102v4dn.html)
		平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ... 
- mysql中key 、primary key 、unique key 与index区别
		一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id ) NOT NULL auto_increment, ) default NU ... 
- MySQL 中的两种临时表
		来源:阿里云RDS - 数据库内核组 链接:http://mysql.taobao.org/monthly/2016/06/07/ 外部临时表 通过CREATE TEMPORARY TABLE 创建的 ... 
- MySQL中的联合索引学习教程
		MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下 联合索引又叫复合索引.对于复合索引:Mysql从左到 ... 
- MySQL查询执行的基础——查询优化处理
		查询的生命周期的下一步是将一个SQL转换成一个可执行计划,MySQL再按照这个计划和存储引擎进行交互 语法解析器和预处理 首先,MySQL通过关键词将SQL语句进行解析,并生成一颗对应的"解 ... 
- mysql基本知识点梳理和查询优化
		目录 一.索引相关 二.EXPLIAN中有用的信息 三.字段类型和编码 四.SQL语句总结 五.踩坑 六.千万大表在线修改 七.慢查询日志 八.查看sql进程和杀死进程 九.一些数据库性能的思考 本文 ... 
随机推荐
- Head First Java学习:第七章-继承和多态
			第七章:继承和多态 1. 覆盖(override) 覆盖的意思是由子类重新定义继承下来的方法,以改变或延伸此方法的行为. 2. 继承(extends) 类的成员:实例变量+方法 实例变量无法覆盖是因为 ... 
- SpringBoot整合简单的定时任务~
			定时任务框架很多种Quartz,SpringTask,xxljob,PowerJob... 1.JDK提供的timer // JDK提供的 Timer timer = new Timer(); //t ... 
- 记一次 .NET 某药厂业务系统 CPU爆高分析
			一:背景 1. 讲故事 前段时间有位朋友找到我,说他们的程序出现了CPU爆高,让我帮忙看下怎么回事?这种问题好的办法就是抓个dump丢给我,推荐的工具就是用 procdump 自动化抓捕. 二:Win ... 
- 3D网站LOGO动画
			相关技术和实现分析 3D模型 帧动画 threejs 推荐用blender创建3d模型,k帧实现从上到下翻转的帧动画 threejs 中执行帧动画,并关联滚动条 threejs 模型材质 Blende ... 
- Spring WebFlux 简介
			本文基于 Spring Boot 2.6.0 基于之前提到的 Reactor 的出现,使得编写响应式程序成为可能.为此,Spring 的开发团队决定添加有关 Reactor 模型的网络层.这样做的话将 ... 
- 文心一言 VS 讯飞星火 VS chatgpt (40)-- 算法导论5.4 4题
			四.一次聚会需要邀请多少人,才能让其中 3 人的生日很可能相同? 文心一言: 为了解决这个问题,我们需要先计算出所有可能的生日组合数,然后计算出其中生日相同的组合数. 已知需要邀请的人数为:23人 根 ... 
- LeetCode 二分查找篇(69、33、704)
			69. x 的平方根 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: ... 
- 【Pandas】groupby连用的count()和size()的区别
			groupby连用的count()和size()的区别 count() 计算的是 value(数值): size() 计算的是 size(个数) 我们有以下表: size() age = df.gro ... 
- 万亿养老市场如何抢占商机?云巢智慧康养物联网加速器,三招化解ISV痛点!
			摘要:云巢智慧康养物联网加速器,围绕ISV的种种痛点,提供快速上云.资源共享.商业合作等多方面的支持,助力企业成长,共建智慧康养物联网生态. 本文分享自华为云社区<万亿养老市场如何抢占商机?云巢 ... 
- 上手测试GaussDB(for Redis) 和开源 Redis,只为推荐质优价廉的Redis
			摘要:一文带你全方位测评 GaussDB(for Redis) 和开源 Redis. 本文分享自华为云社区<程序员硬核测评:全方位测评 GaussDB(for Redis) 和开源 Redis& ... 
