在MySQL中处理高负载表的常见做法

时间:2009-10-12 12:13:39

标签: mysql transactions database high-load

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

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

我虽然朝着延迟删除的方向发展(在低负载时间每天一次),但这不会消除问题,只会使其不那么明显。

在处理MySQL中的高负载表时是否存在常见做法?

1 个答案:

答案 0 :(得分:1)

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

有关详细信息,请参阅this question

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

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