把not in 改成not exists后的优化
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,把not in 改成not exists后的优化 近期,OA数据库里面存在一条慢SQL,其执行时间为3分16秒。这条慢SQL语句每个月可能会运行几次,但其运行后,总会导致数据库CPU利用率飙升。然后
千家信息网最后更新 2025年11月08日把not in 改成not exists后的优化把not in 改成not exists后的优化
近期,OA数据库里面存在一条慢SQL,其执行时间为3分16秒。这条慢SQL语句每个月可能会运行几次,但其运行后,总会导致数据库CPU利用率飙升。然后我就对这个慢SQL语句进行了改写测试,改写后的运行时间降为13s(虽然还是很慢,但已经速度提升了18倍)。
具体分析过程如下: 通过慢日志捕捉到的慢SQL及其运行时间: 1 select id,start_member_id,start_date,modify_member_id,modify_date from formmain_0141 where id not in (select content_data_id from ctp_content_all where content_template_id='6890363387462501722' and content_data_id is not null ) limit 20000, 10000\G Empty set (3 min 2.01 sec)
可见,生产中,该语句运行时间是3分2秒。
我们来看看其执行计划,为什么这么慢:

2、我改写后的索引,用的是 not exists ,内外交互式子查询:
mysql> select id,start_member_id,start_date,modify_member_id,modify_date from formmain_0141 where not exists (select 1 from ctp_content_all where content_data_id= formmain_0141.id and content_data_id is not null and content_template_id='6890363387462501722') limit 20000, 10000 ;
Empty set (13.84 sec)
看到用not exists后,执行时间降到13秒,效率有显著提升。
我们再看一下优化后语句的执行计划:
把not in改写为not exists快的原因,我想用mysql 5.6的新特性ICP的原理来解释,在改写后的sql语句中,MySQL在从 ctp_content_all表中取出数据的同时,就开始判断是否可以在formmain_0141表中进行id过滤,从而大大减少了上层对SQL层的记录索引,提高数据库整体性能。 反观优化前的那条sql语句,它是把 ctp_content_all 表里面所有符合条件的记录都取出来后,再到 formmain_0141表里进行id字段过滤,所以慢。
近期,OA数据库里面存在一条慢SQL,其执行时间为3分16秒。这条慢SQL语句每个月可能会运行几次,但其运行后,总会导致数据库CPU利用率飙升。然后我就对这个慢SQL语句进行了改写测试,改写后的运行时间降为13s(虽然还是很慢,但已经速度提升了18倍)。
具体分析过程如下: 通过慢日志捕捉到的慢SQL及其运行时间: 1 select id,start_member_id,start_date,modify_member_id,modify_date from formmain_0141 where id not in (select content_data_id from ctp_content_all where content_template_id='6890363387462501722' and content_data_id is not null ) limit 20000, 10000\G Empty set (3 min 2.01 sec)
可见,生产中,该语句运行时间是3分2秒。
我们来看看其执行计划,为什么这么慢:

2、我改写后的索引,用的是 not exists ,内外交互式子查询:
mysql> select id,start_member_id,start_date,modify_member_id,modify_date from formmain_0141 where not exists (select 1 from ctp_content_all where content_data_id= formmain_0141.id and content_data_id is not null and content_template_id='6890363387462501722') limit 20000, 10000 ;
Empty set (13.84 sec)
看到用not exists后,执行时间降到13秒,效率有显著提升。
我们再看一下优化后语句的执行计划:
把not in改写为not exists快的原因,我想用mysql 5.6的新特性ICP的原理来解释,在改写后的sql语句中,MySQL在从 ctp_content_all表中取出数据的同时,就开始判断是否可以在formmain_0141表中进行id过滤,从而大大减少了上层对SQL层的记录索引,提高数据库整体性能。 反观优化前的那条sql语句,它是把 ctp_content_all 表里面所有符合条件的记录都取出来后,再到 formmain_0141表里进行id字段过滤,所以慢。
语句
时间
运行
数据
数据库
索引
显著
上层
利用率
原因
原理
同时
字段
式子
性能
总会
效率
整体
日志
条件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
心动网络安全工程师
软件开发职场晋升路线
数据库中 如何对数据筛选
兰州有没有做软件开发的公司
exl根据选项读取数据库
怎么启动对服务器的远程访问
软件开发的论述
soa软件开发工程师
非参数分析实例数据库
2020年全国网络安全十佳
上海瀚途网络技术有限公司 估值
全国职业技能大赛网络安全管理员
物联网网络技术应用
科技互联网行业典型盈利模式
信息技术和软件开发
华为公共软件开发
方舟手游私人服务器名字
数据库ado
如何清除mysql数据库
企业网络安全课程思政
全椒网络安全测评
宣传网络安全相关知识的微信
纽易网络技术
软件开发的论述
中国网络安全监察大队
已重新连接服务器
中国重要会议论文全文数据库在哪
2022江西高考志愿数据库
企业管理软件开发哪家正规
深圳医院预约软件开发