我在MySQL 5(InnoDB)中有一个用作守护进程处理队列的表,因此它经常被非常访问。通常每天插入大约250,000条记录。当我选择要处理的记录时,使用FOR UPDATE查询读取它们以消除竞争条件(一切都是基于事务的)。
现在我正在开发一个“队列存档”,我偶然发现了一个严重的死锁问题。我需要在处理(实时)时从表中删除“已执行”的记录,但是如果我这样做,表格每隔一段时间就会死锁(每天两到三次)。
我虽然朝着延迟删除的方向发展(在低负载时间每天一次),但这不会消除问题,只会使其不那么明显。
在处理MySQL中的高负载表时是否存在常见做法?
答案 0 :(得分:1)
InnoDB
锁定它检查的所有行,而不仅仅是那些请求的行。
有关详细信息,请参阅this question。
您需要创建一个与搜索条件完全匹配的索引,以消除不必要的锁定,并确保使用它。
不幸的是,DML
中的MySQL
次查询不接受提示。