906
技術社區[雲棲]
myrocks fast load data
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)
優化後的bulk load流程(圖片來自yoshinorim)
由於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倍。
perf top
可以看出bulk load模式下,插入流程要簡潔很多。
insert 測試
由於SQL解析占比重較大,bulk load模式下的insert優勢並不明細。
perf top
可以看出普通insert相比load data有更多的SQL解析操作(MySQLparse),同時非bulk load下的insert比bulk load下insert有更多的排序操作(KeyComparator)。
最後更新:2017-05-20 09:31:24