[英]Simple UPDATE query takes too much time in InnoDB than MyISAM
快速說明:
在我的應用程序(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好得多。 但是我發現完全相反。
有人可以澄清這種行為嗎? 我做錯什么了嗎?
我在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.