Update关联查询不走索引,效率低下

本文介绍了一种通过优化SQL语句来提升数据更新效率的方法。针对一个包含37万条记录的大表,在仅有一条匹配记录的情况下,通过调整SQL语句结构,成功将执行时间从6小时缩短到秒级。此外,还总结了常见的不走索引情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   优化一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段。形如

Sql代码  

  1. update A set A.a=(select B.b from B where A.id=B.id);  



原SQL

updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(

select distinctb.scrm_rptpnt_processed  frompntmall_rptpoint_detail_tmp b where a.pntmall_rptpnt_id=b.pntmall_rptpnt_id

);


b表中只有1条数据,a表中有37万条数据,应用逻辑为更新a表中id和b表相同的

这一条SQL执行了6小时未执行完,执行计划显示为全表扫描,也就是说,虽然执行1条SQl,但执行update个过程中将37万条数据进行扫描,直到倒找相同的id进行更新


尝试过hit强制走索引,也不理想,where条件中id列类型是相同的均为INT,不存在字段类型不同导致不走索引的情况。


采取的方式:

优化后的SQL

updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(

select distinctb.scrm_rptpnt_processed  frompntmall_rptpoint_detail_tmp b where a.pntmall_rptpnt_id=b.pntmall_rptpnt_id

) wherea.pntmall_rptpnt_id in (select b.pntmall_rptpnt_id frompntmall_rptpoint_detail_tmp b)


优化后的SQL达到秒级,满足客户需求。


总结一下不走索引的情况:

1、条件字段选择性弱,查出的结果集较大,不走索引;

2、where条件等号两边字段类型不同,不走索引;

3、优化器分析的统计信息陈旧也可能导致不走索引;

4、索引字段 is null 不走索引;

5、对于count(*)当索引字段有not null约束时走索引,否则不走索引;

6、like 后面的字符当首位为通配符时不走索引;

7、使用不等于操作符如:<>、!= 等不走索引;

8、索引字段前加了函数或参加了运算不走索引;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值