本文为博主原创,转载请注明出处:

  最近做性能优化时,通过开启 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 的查询优化的更多相关文章

  1. mysql中min和max查询优化

    mysql max() 函数的需扫描where条件过滤后的所有行: 在测试环境中重现: 测试版本:Server version:         5.1.58-log MySQL Community ...

  2. 【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)

    原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_ ...

  3. mysql中的sql查询优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进 ...

  4. MySQL中的两种临时表

    MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...

  5. MySQL 中NULL和空值的区别 (转载 http://blog.sina.com.cn/s/blog_3f2a82610102v4dn.html)

    平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ...

  6. mysql中key 、primary key 、unique key 与index区别

    一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id ) NOT NULL auto_increment, ) default NU ...

  7. MySQL 中的两种临时表

    来源:阿里云RDS - 数据库内核组 链接:http://mysql.taobao.org/monthly/2016/06/07/ 外部临时表 通过CREATE TEMPORARY TABLE 创建的 ...

  8. MySQL中的联合索引学习教程

    MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下   联合索引又叫复合索引.对于复合索引:Mysql从左到 ...

  9. MySQL查询执行的基础——查询优化处理

    查询的生命周期的下一步是将一个SQL转换成一个可执行计划,MySQL再按照这个计划和存储引擎进行交互 语法解析器和预处理 首先,MySQL通过关键词将SQL语句进行解析,并生成一颗对应的"解 ...

  10. mysql基本知识点梳理和查询优化

    目录 一.索引相关 二.EXPLIAN中有用的信息 三.字段类型和编码 四.SQL语句总结 五.踩坑 六.千万大表在线修改 七.慢查询日志 八.查看sql进程和杀死进程 九.一些数据库性能的思考 本文 ...

随机推荐

  1. Head First Java学习:第七章-继承和多态

    第七章:继承和多态 1. 覆盖(override) 覆盖的意思是由子类重新定义继承下来的方法,以改变或延伸此方法的行为. 2. 继承(extends) 类的成员:实例变量+方法 实例变量无法覆盖是因为 ...

  2. SpringBoot整合简单的定时任务~

    定时任务框架很多种Quartz,SpringTask,xxljob,PowerJob... 1.JDK提供的timer // JDK提供的 Timer timer = new Timer(); //t ...

  3. 记一次 .NET 某药厂业务系统 CPU爆高分析

    一:背景 1. 讲故事 前段时间有位朋友找到我,说他们的程序出现了CPU爆高,让我帮忙看下怎么回事?这种问题好的办法就是抓个dump丢给我,推荐的工具就是用 procdump 自动化抓捕. 二:Win ...

  4. 3D网站LOGO动画

    相关技术和实现分析 3D模型 帧动画 threejs 推荐用blender创建3d模型,k帧实现从上到下翻转的帧动画 threejs 中执行帧动画,并关联滚动条 threejs 模型材质 Blende ...

  5. Spring WebFlux 简介

    本文基于 Spring Boot 2.6.0 基于之前提到的 Reactor 的出现,使得编写响应式程序成为可能.为此,Spring 的开发团队决定添加有关 Reactor 模型的网络层.这样做的话将 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (40)-- 算法导论5.4 4题

    四.一次聚会需要邀请多少人,才能让其中 3 人的生日很可能相同? 文心一言: 为了解决这个问题,我们需要先计算出所有可能的生日组合数,然后计算出其中生日相同的组合数. 已知需要邀请的人数为:23人 根 ...

  7. LeetCode 二分查找篇(69、33、704)

    69. x 的平方根 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: ...

  8. 【Pandas】groupby连用的count()和size()的区别

    groupby连用的count()和size()的区别 count() 计算的是 value(数值): size() 计算的是 size(个数) 我们有以下表: size() age = df.gro ...

  9. 万亿养老市场如何抢占商机?云巢智慧康养物联网加速器,三招化解ISV痛点!

    摘要:云巢智慧康养物联网加速器,围绕ISV的种种痛点,提供快速上云.资源共享.商业合作等多方面的支持,助力企业成长,共建智慧康养物联网生态. 本文分享自华为云社区<万亿养老市场如何抢占商机?云巢 ...

  10. 上手测试GaussDB(for Redis) 和开源 Redis,只为推荐质优价廉的Redis

    摘要:一文带你全方位测评 GaussDB(for Redis) 和开源 Redis. 本文分享自华为云社区<程序员硬核测评:全方位测评 GaussDB(for Redis) 和开源 Redis& ...