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 表示只有主鍵索引code

數據(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 引擎在多進程下的優點it

單進程讀

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

多進程讀

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

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

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

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

相關文章
相關標籤/搜索