把not in 改成not exists后的优化
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,把not in 改成not exists后的优化 近期,OA数据库里面存在一条慢SQL,其执行时间为3分16秒。这条慢SQL语句每个月可能会运行几次,但其运行后,总会导致数据库CPU利用率飙升。然后
千家信息网最后更新 2025年01月23日把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安全错误
数据库的锁怎样保障安全
架设传奇无法启动数据库
plsql数据库模型创建
sql用什么语句切换数据库
网络安全现状分析 开题报告
新三板怎么看表数据库
运营商网络安全设计
南昌惠联网络技术洪葵
河北东振网络技术
网络安全是数字化改革的基础
数据库什么岗位最挣钱
欧洲电脑软件开发
世界网络安全公司500强
税务系统网络安全等级制度
9月郑州网络安全主题晚会
网络安全法二审是哪一年
在寝室连接实验室服务器上网
杨浦区智能软件开发参考价格
婕斯公司有根服务器吗
管理网络安全的产业
数据库50题
服务器安全狗能抗cc吗
软件开发核心技术资料违法吗
战地5如何进服务器
中行网络安全
魔兽世界转服务器卡住了
兴美汇互联网科技有限公司
托管服务器 云服务器
我的世界服务器标语
涉县软件开发技术
医保定点代码数据库维护