【问题标题】:InnoDB query duration inconsistentInnoDB 查询持续时间不一致
【发布时间】:2013-07-02 05:28:45
【问题描述】:

我在一个几乎空的 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 如此行事?

【问题讨论】:

  • 您是否考虑过页面拆分导致不一致的可能性?

标签: mysql innodb myisam duration


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-04-05
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多