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 表示只有主鍵索引
數據(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 支持 事務, 外鍵, 崩潰恢復 一系列高級特性,還有什麼猶豫的嗎?