大量INSERT语句锁定MySQL 5.5中其他表的插入

时间:2013-09-16 09:30:59

标签: mysql sql database percona

我正在尝试了解MySQL 5.5服务器的问题。

此服务器托管许多数据库。在某个特定时间,每个进程都会在此数据库中的 TWO 表中运行一系列插入。此过程持续5到15分钟,具体取决于插入的行数。

此过程运行良好。但它有一个非常意想不到的副作用。所有其他插入和更新都在与插入的两个表无关的表上运行,只是等待直到进程停止。在这个数据库之外的读写工作很好,SELECT语句也很好。

那么单个表如何阻止数据库的其余部分而不是整个服务器(由于加载)?

一些背景知识: -

  • 正在插入的表格是MyISAM,行数为10-20万行。

  • MySQL是Percona V5.5,正在为一个运行的服务器提供服务 的Debian。

  • 插入进程的进程没有调用显式锁定 记录。

  • 所有Insert语句都不会从任何其他语句中选择数据 表。它们也是INSERT IGNORE声明。

附加信息:

发生这种情况时,PROCESS LIST中没有LOCK表条目,插入导致此问题的记录的处理器不会发出任何表锁。

我已经调查了表锁定的常见原因,我想我已经将它们排除在外了。这种行为要么与MySQL的工作原理有关,要么有大型数据库文件,甚至可能与OS /文件系统有关。

1 个答案:

答案 0 :(得分:0)

经过几周的尝试后,我终于找到了这个:Yoshinori Matsunobu Blog - MyISAM and Disk IO Scheduler

Yoshinori演示了将调度程序队列更改为100000(默认值为128)可以显着提高MyISAM在大多数调度程序上的吞吐量。

对我的系统进行此更改后,在此过程运行时,MyISAM表上不再出现数据库挂起的任何戏剧性实例。数据量预计略有放缓,但系统保持稳定。

任何遇到MyISAM性能问题的人都应该阅读Yoshinori的博客文章并考虑这个问题。