MyISAM與InnoDB的優缺點在此就再也不多說了,網上能夠搜出一堆,而這種文章的最後通常都是推薦,讀的多的使用MyISAM,寫與更新多的推薦InnoDB,可是,瞭解過兩種存儲引擎以後,就會產生一種疑惑,InnoDB採用的是聚簇索引,不管是索引仍是數據都是存放在內存中的,MyISAM引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址,找到了以後還要到硬盤上去獲取數據,這樣確定會形成時間損耗的,因此,仍是準備用實驗數據來解決疑惑服務器
個人MySQL的版本是 5.7.22, 服務器是1G1核性能
commit = 0 表示 my.cnf 中 innodb_flush_log_at_trx_commit 的屬性值爲0no 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 支持 事務, 外鍵, 崩潰恢復 一系列高級特性,還有什麼猶豫的嗎?