在 JavaEye 上看到一篇對 MySQL FUD(Fear, uncertainty and doubt) 的文章
用MySQL InnoDB Benchmark 性能測試來說明
文中提到:"InnoDB 的磁盤性能很令人擔心,MySQL 缺乏良好的 tablespace 真是天大的缺陷!……網上有用戶反映存在同樣的插入性能問題,百萬行記錄插入之後,插入速度下降到了 1/30,從開始的 1600行/秒衰退到 50行/秒……"
50行/秒這麼慢我從來沒見過,見也沒人反駁,所以自己再專門驗證一下。
Tim's 環境:
MySQL 5.0.26 x86_64
Linux x86_64
iddata 文件大小17G,未使用innodb_file_per_table分表選項
表1: 1000萬行左右,表大小 2.2G,含主鍵有6個索引字段
表2: 3000萬行左右,表大小 6.3G,含主鍵有6個索引字段
MySQL還有其他一些數據也在iddata中,但測試時候其他數據未訪問。
MySQL Server Hardware 環境
雙 XEON 3G
4G 內存, SCSI 硬盤
非專業非名牌,普通組裝的服務器。
表結構就是一般的用戶表,包含 int, varchar, datetime 字段類型,無 text,blob 類型字段。
單行長度 0.1K 左右
對表1測試2分鐘插入操作,在1千萬的表中每個調用插入1行,通過Java JDBC在另外一台測試機上調用。
服務器 CPU 30%
JDBC Result:
INSERT OK /ERR: 73824/0
Java HEAP: 7.12MB of 63.56 MB (11.2%) used
TIME elapse(sec): 129
AVG平均/CUR當前/MAX最大 Inserts/SEC: 572/620/620
再測試一個3000萬的表,通過Java JDBC在另外一台測試機上調用。
可能上一個測試2分鐘會讓人覺得沒有說服力,3000萬的表二就測試久一點吧。測試了10多分鐘,又插入了100萬條新的數據
一個調用只插入1行,8個線程。使用了連接池。
測試結果速度非常穩定。
服務器 CPU 30%
OK /ERR: 1,006,907/0
HEAP: 6.57MB of 63.56 MB (10.3%) used
TIME elapse(sec): 1683
AVG/CUR/MAX Inserts/Sec: 598/586/647