我在一个几乎空的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会采用这种方式做什么?
答案 0 :(得分:0)
更新在内存中执行(在缓冲池中),除非innodb_flush_method
设置为O_DIRECT
- 它们记录在二进制日志中(在崩溃的情况下重放)并刷新到光盘每秒一次(默认情况下)。这意味着由于此时发生的磁盘I / O,每秒更新一次会更慢。