SQL优化之多表关联批量更新

1、背景

清洗表cookie_clean_t的数据分配清洗,清洗成功的结果记录在成功表cookie_short_succ_t中,间隔10分钟根据成功表cookie_short_succ_t的数据更新清洗表cookie_clean_t中数据状态为成功。清洗表数据量50多万条!

2、实现方案

2.1、版本V1

UPDATE cookie_clean_t cct SET cct.state=1 WHERE cct.state=0
AND cct.uuid IN(SELECT csst.uuid FROM cookie_short_succ_t csst WHERE csst.ctime<![CDATA[ <= ]]>#{lastTime})
AND cct.ctime<![CDATA[ >= ]]>CURDATE()

在配置高的生产环境(8核16G内存4M带宽)并未发现验证问题,在测试环境(2核4G内存2M带宽)影响到数据分发的SQL查询语句吃CPU占到195%

2.2、版本V2

UPDATE cookie_clean_t cct
INNER JOIN cookie_short_succ_t csst ON cct.uuid=csst.uuid 
SET cct.state=1
WHERE cct.state=0 AND cct.ctime>=CURDATE() AND csst.ctime<![CDATA[ <= ]]>#{lastTime}

优化成表关联批量更新后索引生效,CPU占用不足2%

分析SQL语句例子:

EXPLAIN
UPDATE cookie_clean_t cct SET cct.state=1 WHERE cct.state=0
AND cct.uuid IN(SELECT csst.uuid FROM cookie_short_succ_t csst WHERE csst.ctime<='2019-09-10 09:00:00')
AND cct.ctime>=CURDATE()

1 UPDATE cct index idx_state,idx_ctime PRIMARY 8 502077 100 Using where
2 DEPENDENT SUBQUERY csst ALL 1378 3.33 Using where

 

EXPLAIN
UPDATE cookie_clean_t cct
INNER JOIN cookie_short_succ_t csst ON cct.uuid=csst.uuid
SET cct.state=1
WHERE cct.state=0 AND cct.ctime>=CURDATE() AND csst.ctime<='2019-09-10 09:00:00';

1 SIMPLE csst ALL 284 33.33 Using where
1 UPDATE cct eq_ref PRIMARY,idx_state,idx_ctime,idx_uuid PRIMARY 8 db_wb3.csst.uuid 1 25 Using where

 

show full processlist;
kill id;

 

转载于:https://www.cnblogs.com/xx0829/p/11496558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值