1

我在一个几乎为空的 InnoDB 表上运行一系列 UPDATE 命令,每 20-30 个查询中约有 1 个将莫名其妙地花费其他查询的 10 倍。例如,前 20 次更新需要 20ms,第 21 次更新突然需要 200ms。我设置了一个非常基础的测试:

CREATE TABLE `test` (
  `col1` int(11) DEFAULT NULL,
  `col2` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我在表中插入一行,然后我有一个 C# 控制台程序,它执行一系列更新:

for (int i = 0; i < 15; i++) {
   long start = CurrentTimeMillis();

   MySqlCommand cmd = new MySqlCommand();
   cmd.Connection = conn;
   cmd.CommandText = "UPDATE test SET col1=" + i + " WHERE col2=1";
   cmd.Prepare();
   cmd.ExecuteNonQuery();

   Console.WriteLine("Duration: " + (CurrentTimeMillis() - start));
}

这是我从程序中看到的输出:

MySQL version : 5.5.17
Duration: 36
Duration: 30
Duration: 16
Duration: 26
Duration: 152
Duration: 47
Duration: 71
Duration: 77
Duration: 46
Duration: 28
Duration: 21
Duration: 25
Duration: 17

如果我运行“SHOW profile FOR QUERY #”,“更新”和“查询结束”值都异常高。

如果我将表切换到 MyISAM,查询持续时间是一致的,但我不想要表锁定。有没有人猜测是什么让 InnoDB 以这种方式行事?

4

1 回答 1

0

更新在内存中(在缓冲池中)执行,除非innodb_flush_method设置为O_DIRECT- 它们记录在二进制日志中(在崩溃的情况下重播)并每秒刷新一次(默认情况下)。这意味着每秒一次更新会因为此时发生的磁盘 I/O 而变慢。

于 2013-07-06T18:28:24.710 回答