InnoDB查询持续时间不一致

时间:2013-07-04 09:12:00

标签: mysql innodb myisam duration

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

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会采用这种方式做什么?

1 个答案:

答案 0 :(得分:0)

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