优化前的sql
update cluster_env
set status = 'deleted'
where id in
(
select cluster_env_id
from branch_cluster_env
where branch_id in (2194,2195,2196)
)
and name != 'default'
and status !='deleted';
数据不全是这些数据,生产环境cluster_env表含有4000条数据,branch_cluster_env表有6万条数据,就这个更新语句,直接30秒超时。
执行explain查看这条sql的执行计划,可以发现两个语句基本上都是全表扫描,扫描行数2亿多,最终导致超时。
解决方法
给branch_cluster_env表的branch_id字段加上索引,那么子表扫描仅几十行,最终扫描行数在几万级别。
总结
- 多表查询更新操作,多使用explain看看扫描行数,还有in操作也要谨慎使用,没有索引就是全表扫描,多表直接就翻倍了。
- 扫描行数在300万内可接受,千万级别就必须优化。
(☆ω☆)
(*/ω\*)