閱讀557 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MySQL · myrocks · fast data load

Fast data load

Load data相比普通insert效率更高,Load data批量插入數據有效減少了解析SQL的開銷。MyRocks 同其他MySQL 引擎一樣也支持Load data語法,同時MyRocks對data load也做了特殊優化。RocksDB引擎有一個規律是,數據最終會存儲在最底層SST文件中,MyRocks通過參數rocksdb_bulk_load控製是否直接將數據存儲在最底層SST文件中,而不走普通的insert流程。

先來看下普通insert流程(圖片來自yoshinorim)

screenshot.png

優化後的bulk load流程(圖片來自yoshinorim)

screenshot.png

由於SST文件中的數據必須是有序的,所以 bulk load特性有一個限製是插入的數據必須是按主鍵有序的。

Insert和Load data都支持bulk load特性,Load data文件中的數據容易保證有序,但對於非自增insert來說,要保證有序插入比較困難,因此bulk load特性對普通insert意義不大。

rocksdb_bulk_load設為1後,開啟bulk load特性。值得注意的是,在 bulk load特性下,會默認忽略唯一性檢查,同時rocksdb_commit_in_the_middle自動開啟。

Bulk load 源碼實現

  • step 1 第一次插入時會新建SST臨時文件, 參見myrocks::Rdb_sst_info::open_new_sst_file
    文件形如:test.t1_PRIMARY_0_0.bulk_load.tmp
    db.tablename_indexname_count1_count2_.bulk_load.tmp
    其中count1每次都會原子自增,防止並發load時出現重名的情況。
    其中count2表示當前是第幾個SST臨時文件

  • step 2 隨後插入都會直接插入到SST臨時文件中,參見myrocks::Rdb_sst_info::put

  • step 3 SST臨時文件寫滿或load結束,將SST臨時文件copy或hard link為正式的SST文件,同時更新SST元數據信息,參考rocksdb::ExternalSstFileIngestionJob::Prepare/ExternalSstFileIngestionJob::Run

  • step 4 刪除臨時SST文件,參考ExternalSstFileIngestionJob::Cleanup

如果bulk load中途mysqld crash有可能殘留SST臨時文件,mysqld重啟時會自動清理SST臨時文件。參考Rdb_sst_info::init

Bulk load 相關測試

load data 測試

Bulk load下rocksdb load data比innodb快近3倍。
Bulk load下rocksdb load data比rocksdb 普通load data快近6倍。

screenshot.png

perf top

可以看出bulk load模式下,插入流程要簡潔很多。

  • rocksdb without bulk load
    屏幕快照 2017-05-16 上午1.14.05.png

  • rocksdb with bulk load
    屏幕快照 2017-05-16 上午1.08.27.png

insert 測試

由於SQL解析占比重較大,bulk load模式下的insert優勢並不明細。

screenshot.png

perf top

可以看出普通insert相比load data有更多的SQL解析操作(MySQLparse),同時非bulk load下的insert比bulk load下insert有更多的排序操作(KeyComparator)。

  • insert without bulk load
    屏幕快照 2017-05-16 上午12.45.54.png

  • insert with bulk load
    屏幕快照 2017-05-16 上午12.51.43.png

最後更新:2017-05-21 09:02:00

  上一篇:go  PgSQL · 應用案例 · "寫入、共享、存儲、計算" 最佳實踐
  下一篇:go  RocksDB · 特性介紹 · HashLinkList 內存表