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

标签 mysql transactions database high-load

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

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

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

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

最佳答案

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

参见 this question了解更多详情。

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

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

关于mysql - MySQL中处理高负载表的常见做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1554221/

相关文章:

javascript - 网站的 id 传递替代方案

mysql - 限制行数之间的sql查询性能差异

mysql - View 性能增益在现代 RDBMS 中是否仍然相关

json - CF 中关系数据库中的智能与否 : Persist serialized data (dotnet-protobuf, protobuf-net,json)

database - 数据库设计/延迟/并发,令人头疼

c# - SQL Server 2005 上的 ADO.NET 2.0 事务是否在出现异常时自动回滚?

mysql - 无需附加层即可从 Objective-C 连接到 MySQL/Oracle 数据库

php - 如何从已拖放到特定区域的图像中获取值并插入到数据库中?

java - Spring事务管理器不是线程安全的?

c# - 事务中的死锁重试