简要说明:
在我的应用程序(VC ++ / Windows 8)中,我发出了简单的更新查询,以增加MySQL数据库中InnoDB表中字段的值。它与MyISAM表相比需要的时间太长。
详细信息:
我正在创建一个包含DEMO_TABLE
和MyID
列(两个整数)和引擎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好得多。但我发现完全相反。
有人可以澄清这种行为吗?我做错了吗?
答案 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