TokuDB和InnoDB的讀寫分析與比較

jopen 10年前發布 | 14K 次閱讀 TokuDB InnoDB MySQL 數據庫服務器

我們知道,在MySQL單機版本里面最流行的也是唯一支持全事務的引擎為INNODB。 其特點是數據本身是用B-TREE來組織,數據本身即是龐大的根據主鍵聚簇的B-TREE索引。 所以在這點上,寫入速度就會有些降低,因為要每次寫入要用一次IO來做索引樹的重排。 特別是當數據量本身比內存大很多的情況下,CPU本身被磁盤IO糾纏的做不了其他事情了。  這時我們要考慮如何減少對磁盤的IO來排解CPU的處境,那么如何做呢? (當然,如果數據足夠放到內存里面,這些事情大可不必考慮。)

  1. 可以把INNODB 個PAGE增大?(默認16KB)但是增大也就帶來了一些缺陷。 比如,對磁盤進行CHECKPOINT的時間將延后。
  2. 把日志文件放到更快速的磁盤上?比如SSD?


    其實這時,我們可以考慮用另外一個知名的引擎TokuDB。 誰叫MySQL 天生支持隨意可插拔呢!
    TokuDB 其實本身數據存儲用到了B-TREE的變形版本Fractal-Tree。 Fractal-Tree 也就是在B-Tree原來的非葉子節點增加了一個緩存,無論對這個樹怎么操作,都是一個模式:即父親節點的緩存滿了,就流淌到兒子節點,然后兒子節點的緩存滿了后,再次流淌到孫子節點等等一系列最后到了葉子節點,然后等到葉子節點的PAGE足夠大的時候,進行CHECK POINT。當然不管如何做緩存,每次事務后,還是得首先刷新到REDO 日志,要不數據一致性就很難保證了。


    接下來,這里測試下同樣的環境InnoDB和TokuDB的性能差異。當然,我沒有做壓力測試,只是簡單的手動執行了幾次SQL而已。
    (5.6.10-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial))
    用來導入的文件大概為35M。
        1. INNODB.
    對應的參數:
    innodb_buffer_pool_size=32M
    bulk_insert_buffer_size=20M
    query_cache_size = 0
導入性能:(InnoDB在這里慢在CPU一直忙于IO置換。)  
mysql> load data infile '/tmp/t3_push.csv' into table t3_push;  
Query OK, 955527 rows affected (30 min 44.03 sec)  
Records: 955527  Deleted: 0  Skipped: 0  Warnings: 0  


讀性能:(讀的性能還是很好的,這里用到5.6的ICP以及MRR特性。)  
mysql> select count(*) from t3_push where rank1 < 20 and rank2 < 30;          
+----------+  
| count(*) |  
+----------+  
|       49 |  
+----------+  
1 row in set (0.06 sec)  


調大  
innodb_buffer_pool=128M  


mysql> load data infile '/tmp/t3_push.csv' into table t3_push;  
Query OK, 955527 rows affected (38.72 sec)  
Records: 955527  Deleted: 0  Skipped: 0  Warnings: 0  
調大后,其實導入性能還是不錯的。  </pre><pre class="brush:sql; toolbar: true; auto-links: false;">    1. INNODB.  
對應的參數:  
 innodb_buffer_pool_size=32M  
 bulk_insert_buffer_size=20M  
 query_cache_size = 0  


導入性能:(InnoDB在這里慢在CPU一直忙于IO置換。)  
mysql> load data infile '/tmp/t3_push.csv' into table t3_push;  
Query OK, 955527 rows affected (30 min 44.03 sec)  
Records: 955527  Deleted: 0  Skipped: 0  Warnings: 0  


讀性能:(讀的性能還是很好的,這里用到5.6的ICP以及MRR特性。)  
mysql> select count(*) from t3_push where rank1 < 20 and rank2 < 30;          
+----------+  
| count(*) |  
+----------+  
|       49 |  
+----------+  
1 row in set (0.06 sec)  


調大  
innodb_buffer_pool=128M  


mysql> load data infile '/tmp/t3_push.csv' into table t3_push;  
Query OK, 955527 rows affected (38.72 sec)  
Records: 955527  Deleted: 0  Skipped: 0  Warnings: 0  
調大后,其實導入性能還是不錯的。  </pre>來自:http://blog.csdn.net/yueliangdao0608/article/details/21230627<br />
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!