Mysql索引的重要性

优化前的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字段加上索引,那么子表扫描仅几十行,最终扫描行数在几万级别。

总结

  1. 多表查询更新操作,多使用explain看看扫描行数,还有in操作也要谨慎使用,没有索引就是全表扫描,多表直接就翻倍了。
  2. 扫描行数在300万内可接受,千万级别就必须优化。
tag(s): Java 
show comments · back · home
0评论