Mysql insert在執行數據時到底性能怎麼樣,估計大多數據同學都回答不出來,今天我找了一些測試文章,但最後還是自己來測試一下以數據說話。
前些時候對Mysql做了些測試,得到了一些測試數據。網上看到一些Mysql相關總結,並不能一味相信,還是需要看數據說話。
下面的測試用例都是插入1千萬條數據,分別對三種類型的數據表類型進行測試(MYISAM,INNODB,NDB),測試用例是:
NDB是官方的集群部署版本,測試數據是基於6.x。Mysql proxy也是官方的,用的好像是0.8.x版本,做過負載均衡,讀寫分離測試,負載均衡比較穩定,但是讀寫分離在多線程下則非常不穩定。
1.MYISAM類型數據表的單線程
2.INNODB類型數據表的單線程,開啟innodb_flush_log_at_trx_commit
3.INNODB類型數據表的單線程,關閉innodb_flush_log_at_trx_commit
4.MYISAM 100線程、100連接池
5.INNODB 100線程、100連接池,NO LOG
6.MYISAM 1000線程、1000線程池
7.INNODB 1000線程、1000線程池
8.NDB類型數據表(3NODE、3份冗余),單線程, 使用Mysql proxy負載均衡
9.NDB(3NODE、3冗余),100線程,100連接池,使用Mysql proxy
10.NDB(3NODE、3冗余),1000線程,1000連接池,使用Mysql proxy
測試結果總結:
•橫坐標為數據量,縱坐標為時間,單位毫秒。用來泡測試用例的機器性能比較次,開啟2000個線程後就跑不動了。
•測試用例並沒有用到事務,所有測試Insert內容為 10個varchar(255)字段,插入內容為10個32位的 uuid,除了主鍵沒有建立其它索引。
•測試都是跑在虛擬機上的,NDB類型由於考慮虛機共享網卡和CPU原因,是三台獨立的宿主機。
•MYISAM在壓力測試下優勢非常明顯,最下面一條線是100線程的,僅次於的是1000線程的,而且性能基本是線性的。
•INNODB測試首先要看 innodb_flush_log_at_trx_commit 這個條件,開啟log的性能在單線程下差點墊底。
•INNODB在關閉Log後,性能倒是可以接受,但是大壓力下性能有明顯的下降,且稱不上線性。
•NDB數據時放在內存中的,再加上設置了3分冗余量,默認配置的內存很快就被消耗干淨了,需要手動設置一下使用內存大小。目測數據冗余的建立是同步的。
•NDB數據由於都是放在內存中的,原以為測試性能不會太差。NDB在單線程下則是墊底的,可能Proxy對性能有一定的影響,不過好消息是100線程和1000線程在圖上的表現基本是重合的。
Mysql相關的技術非常豐富,五花八門,基本上我能想到的網上都能找到相關方案。但是在雲計算時代,可能需要顧及向下兼容,則沒有特別的方案能解決數據一致性、高負載、冗余災備和海量數據等問題。從insert來看,用MongoDB測試了單線程下的1千萬數據,速度是Mysql的3倍,基於存儲原理(MongoDB將索引放在內存中)估計select性能差距會更大。越來越多的非關系型數據庫在這些方面越來越成熟,Mysql的優勢基本只剩下事務支持了。