把not in 改成not exists后的优化
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,把not in 改成not exists后的优化 近期,OA数据库里面存在一条慢SQL,其执行时间为3分16秒。这条慢SQL语句每个月可能会运行几次,但其运行后,总会导致数据库CPU利用率飙升。然后
千家信息网最后更新 2026年11月02日把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安全错误
数据库的锁怎样保障安全
广州为想互联网科技有限公司
云之行互联网科技
互联网科技产业
互联网科技官网
朗新科技与工业互联网
互联网科技的英文
互联网女皇 腾讯科技
互联网养老 桔豆科技
成都玖崟互联网科技有限公司乐商圈怎么样
互联网教育科技公司vipkid
港股科技和互联网
华夏互联网科技业
西安小鹰速贷互联网科技有限公司
翼展科技 首家互联网医院
为客找房互联网科技公司怎么样
锡山区互联网智能科技产品供应
银行科技岗属于互联网吗
盐城市攀科互联网科技有限公司
现代互联网科技公司
平安好医生打造互联网科技医疗
互联网科技工作委员会
蓝思科技飞鸽互联网
卓越科技(互联网 )
互联网金融科技平台
米客互联网科技
海南科技产业互联网平台
银川新华互联网科技学校地址
科技赋能互联网健康
茂名市互联网科技产业园
浙南科技城互联网大厦招聘