1

我在 MySQL 5 (InnoDB) 中有一个表,用作守护进程处理队列,因此它经常被访问。通常每天插入大约 250 000 条记录。当我选择要处理的记录时,使用 FOR UPDATE 查询读取它们以消除竞争条件(一切都是基于事务的)。

现在我正在开发一个“队列存档”,我偶然发现了一个严重的死锁问题。我需要在处理(实时)表时从表中删除“已执行”记录,但是如果我这样做(每天两到三次),表每隔一段时间就会死锁一次。

我虽然倾向于延迟删除(在低负载时间每天一次),但这并不能消除问题,只会让它变得不那么明显。

在 MySQL 中处理高负载表是否有通用做法?

4

1 回答 1

1

InnoDB锁定它检查的所有行,而不仅仅是那些请求的行。

有关更多详细信息,请参阅此问题

您需要创建一个与您的搜索条件完全匹配的索引,以摆脱不必要的锁,并确保使用它。

不幸DML的是,查询MySQL不接受提示。

于 2009-10-12T12:21:16.327 回答