简单的 UPDATE 查询在 InnoDB 中比在 MyISAM 中花费太多时间

Simple UPDATE query takes too much time in InnoDB than MyISAM

简要说明:

在我的应用程序 (VC++/Windows 8) 中,我正在发出简单的更新查询以增加 MySQL 中 InnoDB table 中字段的值数据库。它比 MyISAM table.

花费的时间太长

详情:

我正在创建一个 table DEMO_TABLE 具有列 MyIDMyCounter(均为整数)和引擎 MyISAM

pStatement->execute("CREATE TABLE IF NOT EXISTS DEMO_TABLE(MyID int NOT NULL PRIMARY KEY, MyCounter int) ENGINE=MyISAM");

然后我将 MyID 值等于 0 的行添加到 table。然后我在循环中发出更新查询:

time_t dwTime1 = time(&dwTime1);
for (int i=0; i<500; i++)
{
    char strUpdateRequest[256];
    sprintf_s(strUpdateRequest, 256, "UPDATE DEMO_TABLE SET MyCounter = (MyCounter + 1) WHERE ThreadID = 0");
    pStatement->executeUpdate(strUpdateRequest);
}
time_t dwTime2 = time(&dwTime2);
std::cout << "\nTime difference: " << (dwTime2 - dwTime1);

它 运行 很快,输出是:

Time difference: 0

表示它消耗了不到一秒。

但是当我删除 table 并使用 InnoDB 引擎再次重复所有这些练习时。

pStatement->execute("CREATE TABLE IF NOT EXISTS DEMO_TABLE(ThreadID int NOT NULL PRIMARY KEY, MyCounter int) ENGINE=InnoDB");

然而,令我惊讶的是这次花费了更长的时间,输出是:

Time difference: 17

已消耗17秒

(尽管,在上述两种情况下,我检查了 table containts 并发现 MyCounter 列值已正确填充(500))

更新:

我也观察到在这 17 秒内有很多磁盘 activity。

问题:

在许多讨论中甚至在 MySQL 文档中都提到,在更新的情况下,InnoDB 的性能比 MyISAM 好得多。但是我观察到的恰恰相反。

有人可以澄清一下这种行为吗?我做错了什么吗?

我发现问题出在 my.ini(可以位于 C:\ProgramData\MySQL\MySQL Server 5.6 或基于安装的类似文件夹)

有一个参数 innodb_flush_log_at_trx_commit,它的值默认为零,导致每次提交时将 1 MB 的 innodb_log_buffer_size 写入磁盘。这导致了重大的性能损失。

所以我在阅读了它的描述后制作了innodb_flush_log_at_trx_commit=2,然后重新启动了MySQL服务器,然后性能提升了很多。

If set to 1, InnoDB will flush (fsync) the transaction logs to the disk at each commit, which offers full ACID behavior. If you are willing to compromise this safety, and you are running small transactions, you may set this to 0 or 2 to reduce disk I/O to the logs. Value 0 means that the log is only written to the log file and the log file flushed to disk approximately once per second. Value 2 means the log is written to the log file at each commit, but the log file is only flushed to disk approximately once per second.

innodb_flush_log_at_trx_commit=2