程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 反駁MySQL InnoDB (不行)的性能問題,千萬級別記錄來測試說明

反駁MySQL InnoDB (不行)的性能問題,千萬級別記錄來測試說明

編輯:關於MYSQL數據庫

  在 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

  測試結果是:3000萬行的表再插入100萬行速度持續在將近 600行/秒

  論壇文章中還提到"看著文件尺寸 100KB 100KB 的增長,是沒法體會痛苦的",

  根據MySQL文檔,這個增長的size可以配置的,如果數據庫大量INSERT, 可以把innodb文件設成每次增長100M或更大。

  測試後打算回復一下,可惜JavaEye上新注冊了的賬號沒有論壇發文的權限,只好先放在自己家了。感興趣的朋友可以去那邊討論。

  第二天補充:今天覺得文章說服力不夠,因為我的測試表沒有TEXT/BLOB字段,所以再測試下大字段,加了個TEXT字段,每行TEXT插入10K,整體速度比上個肯定會低一點,

  但可以證明沒有線性下降的問題,也可以給大家提供更多參考。

  表中已有1000萬行記錄,采用上面相同的程序。

  服務器 CPU 持續在 30%左右,測試結果見下圖

  

  測試結果每行插入10k數據,速度維持在300行/秒左右。數據庫寫入速度大致為: 3M/S

  下次有時間再試試單表1億條記錄的。我覺得速度應該還會保持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved