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

时间:2015-05-30 11:04:02

标签: mysql database innodb myisam

简要说明:

在我的应用程序(VC ++ / Windows 8)中,我发出了简单的更新查询,以增加MySQL数据库中InnoDB表中字段的值。它与MyISAM表相比需要的时间太长。

详细信息:

我正在创建一个包含DEMO_TABLEMyID列(两个整数)和引擎MyCounter

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

然后我在表中添加了MyID值等于0的行。然后我在循环中发出UPDATE查询:

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);

它跑得很快,输出是:

  

时差:0

意味着消耗不到一秒钟。

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

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

但是,这一次让我感到意外的是它需要更长时间,输出结果为:

  

时差:17

耗时17秒。

(尽管如此,在上述两种情况下,我检查了表格的含量并发现MyCounter列值已正确填充(500))

更新

我也观察到这17秒内有很多磁盘活动。

问题:

在许多讨论中甚至在MySQL文档中都提到过,在更新的情况下,InnoDB的性能比MyISAM好得多。但我发现完全相反。

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

1 个答案:

答案 0 :(得分:0)

我发现问题出现在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服务器,然后性能提升了很多。

  

如果设置为1,InnoDB会将事务日志刷新(fsync)到   每次提交时都有磁盘,它提供完整的ACID行为。如果你是   愿意妥协这种安全,而你的运行规模很小   事务,您可以将此设置为0或2以减少磁盘I / O.   日志。值0表示日志仅写入日志文件和   日志文件大约每秒刷新一次到磁盘。价值2   表示在每次提交时将日志写入日志文件,但日志   文件大约每秒刷新一次到磁盘。

innodb_flush_log_at_trx_commit=2