簡體   English   中英

簡單的UPDATE查詢在InnoDB中比MyISAM花費太多時間

[英]Simple UPDATE query takes too much time in InnoDB than MyISAM

快速說明:

在我的應用程序(VC ++ / Windows 8)中,我正在發出簡單的更新查詢以增加MySQL數據庫中InnoDB表中字段的值。 它比MyISAM表花費的時間太長。

細節:

我正在創建一個表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的行。然后我在循環中發出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM