我正在尝试了解MySQL 5.5服务器的问题。
此服务器托管许多数据库。在某个特定时间,每个进程都会在此数据库中的 TWO 表中运行一系列插入。此过程持续5到15分钟,具体取决于插入的行数。
此过程运行良好。但它有一个非常意想不到的副作用。所有其他插入和更新都在与插入的两个表无关的表上运行,只是等待直到进程停止。在这个数据库之外的读写工作很好,SELECT语句也很好。
那么单个表如何阻止数据库的其余部分而不是整个服务器(由于加载)?
一些背景知识: -
正在插入的表格是MyISAM,行数为10-20万行。
MySQL是Percona V5.5,正在为一个运行的服务器提供服务 的Debian。
插入进程的进程没有调用显式锁定 记录。
所有Insert语句都不会从任何其他语句中选择数据 表。它们也是INSERT IGNORE声明。
附加信息:
发生这种情况时,PROCESS LIST中没有LOCK表条目,插入导致此问题的记录的处理器不会发出任何表锁。
我已经调查了表锁定的常见原因,我想我已经将它们排除在外了。这种行为要么与MySQL的工作原理有关,要么有大型数据库文件,甚至可能与OS /文件系统有关。
答案 0 :(得分:0)
经过几周的尝试后,我终于找到了这个:Yoshinori Matsunobu Blog - MyISAM and Disk IO Scheduler
Yoshinori演示了将调度程序队列更改为100000(默认值为128)可以显着提高MyISAM在大多数调度程序上的吞吐量。
对我的系统进行此更改后,在此过程运行时,MyISAM表上不再出现数据库挂起的任何戏剧性实例。数据量预计略有放缓,但系统保持稳定。
任何遇到MyISAM性能问题的人都应该阅读Yoshinori的博客文章并考虑这个问题。