mysql做update时有in关联子查询条件时效率奇慢分析


# Query_time: 4.568689 Lock_time: 0.000068 Rows_sent: 0 Rows_examined: 6157476
SET timestamp=1414501476;

UPDATE push_group_task SET arrive_num = arrive_num+1,update_time = NOW() WHERE id IN (SELECT p.group_task_id FROM push_task p WHERE p.state = 0 AND p.cust_id='166518' AND p.push_begin_time <= NOW() AND NOW() < p.push_end_time AND p.time_bucket_begin <= FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()), '%H') AND FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()), '%H') < p.time_bucket_end);

表push_group_task一共只有1137条记录
而表push_task一共只有6094条记录
但是在只涉及这两个表的这个sql做更新的时候,却查询了6928878条记录
导致并发执行时候暴露出来这条SQL的速度奇慢。
1137*6094=6928878

分析是mysql没有先执行in里面的子查询,如果是把子查询查出之后,只需要update几条数据;
这样看起来mysq是逐行遍历push_group_task表,把每条记录都去做一次in子查询。


目前把这条sql拆成两条,先把in里面的select值全查出来,再把结果放到update里面;

/** 查出结果以逗号分割*/
SELECT GROUP_CONCAT(p.group_task_id SEPARATOR ',') FROM push_task p WHERE p.state = 0 AND p.cust_id='100541' AND p.push_begin_time <= NOW() AND NOW() < p.push_end_time AND p.time_bucket_begin <= FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()), '%H') AND FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()), '%H') < p.time_bucket_end

/** 把查出的结果放到in里面*/
UPDATE push_group_task SET arrive_num = arrive_num+1,update_time = NOW() WHERE id IN (1,2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值