起因是如此简单的一句sql
提示:Timeout 时間已到在操作完成之前超时时间已过或服务器未响应。
1、检查WHERE条件中字段是否已建索引
2、检查是否被其他表引用引用表外键字段上是否已建索引
3、分批次删除,根据容量大小设置条数
首先我们能想到的分批肯定是 TOP
top多少合适呢具体还要根据实际场景自己试。
条数多了会慥成锁阻塞即使条数少了也不是没有阻塞可能的,而且听说频繁的删除操作会造成相同语句的IO差距很大比较不稳定,没有亲自试不知道传闻是不是真的。
在有自增列且自增列有索引的情况下分两步走,①取一批次ID②删除
在有自增列且自增列有索引的情况下,根据MIN(ID),MAX(ID)區间分批次删除
当然,最好是将MIN(ID),MAX(ID)先读出来啦,我这里只是示意一下
写法3在各方面都更为优质。当然这个结论是基于我的表约3000w条数据每批5000条删除的情况,不排除其他场景下的会得到其他结论的可能没有万能的语句,大家还是要自己试的啊