MyISAM與InnoDB性能測試對比

MyISAM與InnoDB的優缺點在此就不再多說了,網上可以搜出一堆,而這種文章的最後一般都是推薦,讀的多的使用MyISAM,寫與更新多的推薦InnoDB,但是,瞭解過兩種存儲引擎之後,就會產生一種疑惑,InnoDB採用的是聚簇索引,無論是索引還是數據都是存放在內存中的,MyISAM引擎使用B+Tree作爲索引結構,葉節點的data域存放的是數據記錄的地址,找到了之後還要到硬盤上去獲取數據,這樣肯定會造成時間損耗的,所以,還是準備用實驗數據來解決疑惑

我的MySQL的版本是 5.7.22, 服務器是1G1核

單進程寫

commit = 0 表示 my.cnf 中 innodb_flush_log_at_trx_commit 的屬性值爲0

no index 表示除主鍵索引爲無其他索引 這裏有四個索引

index 表示只有主鍵索引

數據(w) MyISAM (index) MyISAM (no index) InnoDB (commit=0) (index) InnoDB (commit=0) (no index)
1 6.39 3.90 4.99 4.89
5 26.89 22.73 29.80 22.33
10 49.55 34.96 53.40 33.21
50 189.20 139.93 260.78 200.74

綜上可以看出,單進程一條一條的插入的時間,MyISAM的性能略佔優勢,但是並不太明顯, 而無索引比有索引的又略佔優勢,這也是因爲插入的時候同時還要注意維護索引樹導致的,所以,索引雖好,可不要太貪了。

數據(w) MyISAM (index) MyISAM (no index) InnoDB (commit=0) (index) InnoDB (commit=0) (no index)
1 9.70 4.91 60.9 49.8
5 32.01 18.33 306.55 243.17

還有10w和50w的數據就不再比較了,因爲性能差距太明顯了,那這裏就有一個問題了, innodb_flush_log_at_trx_commit 這個參數是什麼意思,爲什麼會有那麼大的影響

innodb_flush_log_at_trx_commit=0 (延遲寫、實時刷):log_buffer --每隔1秒--> log_file --實時--> disk
innodb_flush_log_at_trx_commit=1 (實時寫、實時刷):log_buffer --實時--> log_file --實時--> disk
innodb_flush_log_at_trx_commit=2 (實時寫、延遲刷):log_buffer --實時--> log_file --每隔1秒 --> disk

所以,這裏其實是刷日誌到硬盤導致的性能下降,這裏還是需要注意的,性能影響還是很大的

多進程寫

這裏以每個進程寫1w條數據爲例

進程數 MyISAM(s/進程) InnoDB(s/進程)
20 90.00 29.66
50 255.89 74.52
100 545.385 201.94

上面充分可以展示出來InnoDB 引擎在多進程下的優勢

單進程讀

總次數(w) MyISAM(總時間 s) InnoDB(總時間 s)
1 67.14 77.15
5 110.58 104.21
10 136.02 146.26

多進程讀

這裏以每個進程讀5k條數據爲例

進程數 MyISAM(s/進程) InnoDB(s/進程)
20 140.89 140.37
50 366.32 308.76
100 766.37 615.50

可以看出,在單進程的讀中,MyISAM戰友微弱的優勢,但這種微弱的優勢在多進程中也蕩然無存了

再考慮InnoDB 支持 事務外鍵崩潰恢復 一系列高級特性,還有什麼猶豫的嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章