mysql in与exists问题剖析
1 问题描述
发布当天发现一个日志分析的sql,在测试环境上执行良好,1秒内,而在线上环境上,执行要13秒左右。
嵌套sql一步一步分析后,发现出在in上,因时间紧迫,来补不及具体分析原因,尝试使用exists来解决,秒出(0.03秒)
1.1 具体sql(in),执行时间:12.370
SELECT DISTINCT
t2.reportdate,
t2.uid,
t2.datasetnum,
t2.visualnum
FROM
report_dvnum t2
WHERE
t2.reportdate IN (
SELECT
max(t3.DAY_SHORT_DESC) AS reportdate
FROM
dim_day t3
GROUP BY
t3.WEEK_ID
UNION ALL
SELECT
date_sub(CURDATE(), INTERVAL 1 DAY) AS reportdate
)
1.2 具体sql(exists),执行时间:0.034
SELECT DISTINCT
t2.reportdate,
t2.uid,
t2.datasetnum,
t2.visualnum
FROM
report_dvnum t2
WHERE
EXISTS (
SELECT
1
FROM
(
SELECT
max(t3.DAY_SHORT_DESC) AS reportdate
FROM
dim_day t3
GROUP BY
t3.WEEK_ID
UNION ALL
SELECT
date_sub(CURDATE(), INTERVAL 1 DAY) AS reportdate
) t4
WHERE
t2.reportdate = t4.reportdate
2 事后分析
2.1 首先查看执行计划
sql(in):
slq(exists):
发现exists多了索引关联的项。
2.2 in与exists区别
exists和in的使用方式:
`#对B查询涉及id,使用索引,故B表效率高,可用大表 ``-->外小内大`
1、exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(尽量用小表),故内表大的使用exists,可加快效率;
2、in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,对外表使用索引(外表效率高,可用大表),而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。
结论简单说:外小内大,用exists,外大内小用in,但是我们的情况其实是外大内小,用in是没问题。。
3 问题解决
问题出在in 里面的union all上,in改成:
SELECT DISTINCT
t2.reportdate,
t2.uid,
t2.datasetnum,
t2.visualnum
FROM
report_dvnum t2
WHERE
t2.reportdate IN (
select reportdate from(
SELECT
max(t3.DAY_SHORT_DESC) AS reportdate
FROM
dim_day t3
GROUP BY
t3.WEEK_ID
UNION ALL
SELECT
date_sub(CURDATE(), INTERVAL 1 DAY) AS reportdate) t4
)
使用大括号把 in里面的sql括起来,就会使用索引,0.01秒执行完成。
mysql in与exists问题剖析的更多相关文章
- mysql in与exists区别
1.exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(尽量用小表),故内表大的 ...
- MySQL 子查询 EXISTS 和 NOT EXISTS(转)
MySQL EXISTS 和 NOT EXISTS 子查询 MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT ... FROM table WHERE 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 Execution Plan--NOT EXISTS子查询优化
在很多业务场景中,会使用NOT EXISTS语句来确保返回数据不存在于特定集合,部分场景下NOT EXISTS语句性能较差,网上甚至存在谣言"NOT 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中! ==========结果集 ...
- Mysql 关于not exists一例
场景: 业务上需要做一个查询,因为是Web及时响应,所以对响应时间有要求,原业务场景是需要从无库存订单中剔除绑定闲置库存,因单条sql查询实现复杂,故考虑用差集方式: select a.col1, a ...
- mysql in和exists性能比较和使用【转】
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...
随机推荐
- 初探WINDOWS下IME编程
初探WINDOWS下IME编程作者:广东南海市昭信科技有限公司-李建国 大家知道,DELPHI许多控件有IME属性.这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现.下面说一下本 ...
- Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法
原文:Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法 [函数名称] 二值图像轮廓提取 ContourExtraction(WriteableBitm ...
- SQLServer2005数据库快照的简单使用
原文:SQLServer2005数据库快照的简单使用 SQLServer2005数据库快照的简单使用 ...
- C# 中使用OPenCV(Emgu)心得
原文:C# 中使用OPenCV(Emgu)心得 首先介绍一下自己的情况,2010年的3月份开始接触学习C#编程,之前C#和OpenCV都是零基础,由于全都是自学进度比较慢,中间也走了不少弯路.进过三个 ...
- easyui tree后台传json处理问题
一.tree json格式 [ { "id": 1, "text": "权限管理", "iconCls": " ...
- 梅林路由器 开启ssh key远程登录
转载自 开启SSH KEY在手机远程登陆路由 http://koolshare.cn/thread-67565-1-1.html (出处: KoolShare) 首先修改路由的登录名和密码 下载put ...
- 设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死(提升权限后,使用SetSystemFileCacheSize API函数,并将此做成了一个Service)
声明: 找到服务器僵死的原因了,原因是虚拟内存设置小于物理内存. 只要虚拟内存设置为系统默认大小就不会出生僵死的现象了. 当时因为服务器内存48G,系统默认虚拟内存大小也是48G, 觉得太占硬盘空间, ...
- oh my god,写20万数据到Excel只需9秒
还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万条以上,最初采用的方式就是在服务器端用NPOI生成Excel,把Data一行一行一个Cell一个Cell地写到 ...
- TCP使用注意事项总结
目录 发送或者接受数据过程中对端可能发生的情况汇总 本端TCP发送数据时对端进程已经崩溃 本端TCP发送数据时对端主机已经崩溃 本端TCP发送数据时对端主机已经关机 某个连接长时间没有数据流动 TCP ...
- WebRTC开发者必备 | 《WebRTC1.0: 浏览器间实时通讯》中文版免费下载
随着移动互联网的崛起与完善,WebRTC的应用场景相较于它刚诞生时已经有了极大的变化,以图片和视频为代表的流媒体技术走向普及,交互式网站也逐渐成为互联网的新常态,因此WebRTC API应该把当前以及 ...