我在一个几乎为空的 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 以这种方式行事?