前提: mysql在5.0之前,讀寫性能相差很大,讀性能:myisam 很強
mysql在5.0之后,差距不是很大
http://passover.blog.51cto.com/2431658/507265
http://blog.csdn.net/cchaha/article/details/1782723
http://www.taobaodba.com/
由於近期有個項目對系統性能要求很高,技術選型上由於種種原因已經確定使用Mysql數據庫,接下來就是要確定到底使用哪種存儲引擎。我們的應用是典型的寫多讀少,寫入內容為也很短,對系統的穩定性要求很高。所以存儲引擎肯定就定在廣泛使用的Innodb和MyISAM之中了。
至於兩者的比較網上也有很多,但是畢竟這個事情也不復雜,決定還是自己來做,去驗證一下在我們的場景下誰更優。
測試的版本是mysql Ver 14.14 Distrib 5.1.49, for debian-linux-gnu (i686),使用的是Innodb plugin 1.0.8(官方稱比built-in版本性能更好)和默認的MyISAM。
測試機器是我的筆記本,配置如下:Intel 酷睿2雙核 P8600,2G*2 DDR3 1066內存,320G硬盤5400轉。
測試一:數據插入性能測試,這里我分別對innodb_flush_log_at_trx_commit參數打開和關閉都測了了一下,每次測試都是運行40s,表中數字都是實際插入條數。
MyISAM Innodb (打開) Innodb (關閉)
單線程,逐個插入 120000 60000 60000
4線程,逐個插入 40000*4 20000*4 40000*4
單線程,批量100條/次插入 3600*100 800*100 3000*100
單線程,批量200條/次插入 1800*200 400*200 1600*200
可以發現批量插入的性能遠高於單條插入,但是一次批量的大小對性能影響不大。每條記錄是否都刷新日志的參數對innodb性能的影響巨大。總體上來說,MyISAM性能更優一點。這里有一點需要注意,在插入測試過程中,我對系統資源進行了監控,發現MyISAM對系統資源占用很低,但是Innodb對磁盤占用卻很高,應該是對事務控制多了很多需要記錄的日志。
測試二:數據讀取性能測試。每次隨機讀取1000條記錄,反復進行讀取。
MyISAM Innodb
單線程,200次讀取 5.7s 16.7s
4線程,200次讀取 12s 40.8s
可以看出MyISAM的讀取性能非常恐怖,性能差距在3倍的樣子。
以上兩個測試發現MyISAM在無事務的需求下幾乎完勝,但是要知道它是表鎖,Innodb是行鎖,那么在並發讀寫同時存在的情況下,那結果會是怎么樣呢?!
測試三:兩個線程並發寫入,2個線程並發讀取。
MyISAM Innodb
逐個插入 寫入40s:10000*2 讀取200次*2:14s 寫入40s:60000*2 讀取200次*2:50s
批量100條/次插入 寫入40s:1000*100*2 讀取200次*2:10s 寫入40s:1500*100*2 讀取200次*2:50s
這下立刻顯示出Innodb在並發情況下強勁的性能,幾乎沒有什么性能衰減。而MyISAM單條插入速度變得非常慢,批量插入也下降了40%性能。
總結一下,在寫多讀少的應用中還是Innodb插入性能更穩定,在並發情況下也能基本,如果是對讀取速度要求比較快的應用還是選MyISAM。
另外提一下,這里需要用到對Innodb的熱備份,除了用Master-Slave的方式,還可以選用XtraBackup這個開源軟件。