【发布时间】:2015-05-30 11:04:01
【问题描述】:
简要说明:
在我的应用程序 (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 好得多。但我观察到的恰恰相反。
有人可以澄清这种行为吗?我做错什么了吗?
【问题讨论】:
-
您可能需要提交每个更新或在您的库中启用
autocommit。此外,请检查大量更新,例如10,000 和同时在多行上。与 MyISAM 的表级锁定相比,InnoDB 受益于行级锁定,在这里您只处理测试中的一行。
标签: mysql database innodb myisam