0

我试图了解我在使用 MySQL 5.5 服务器时遇到的问题。

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

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

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

一点背景:-

  • 插入的表是具有 10 - 2000 万行的 MyISAM。

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

  • 插入记录的进程不需要显式锁定。

  • 没有任何插入语句不会从任何其他表中选择数据。它们也是 INSERT IGNORE 语句。

附加信息:

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

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

4

1 回答 1

0

经过几周的尝试,我最终发现了这个:Yoshinori Matsunobu Blog - MyISAM and Disk IO Scheduler

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

在对我的系统进行此更改后,当此进程运行时,MyISAM 表上不再有任何严重的数据库挂起实例。数据量略有放缓,但系统保持稳定。

任何遇到 MyISAM 性能问题的人都应该阅读 Yoshinori 的博客条目并考虑此修复。

于 2013-11-26T09:37:37.453 回答