我在 MySQL 5 (InnoDB) 中有一个表用作守护进程处理队列,因此它被非常访问。通常每天插入大约 250 000 条记录。当我选择要处理的记录时,会使用 FOR UPDATE 查询读取它们以消除竞争条件(一切都是基于事务的)。
现在我正在开发一个“队列存档”,但我遇到了一个严重的死锁问题。我需要在处理(实时)表时从表中删除“已执行”记录,但如果我这样做(每天两到三次),表会每隔一段时间死锁一次。
我虽然转向延迟删除(在低负载时间每天一次)但这不会消除问题只会让它不那么明显。
在处理 MySQL 中的高负载表时是否有通用的做法?
最佳答案
InnoDB
锁定它检查的所有行,而不仅仅是那些请求的行。
参见 this question了解更多详情。
您需要创建一个与您的搜索条件完全匹配的索引以摆脱不必要的锁定,并确保它已被使用。
不幸的是,MySQL
中的DML
查询不接受提示。
关于mysql - MySQL中处理高负载表的常见做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1554221/