天天看點

MySQL · 特性分析 · MyRocks簡介

rocksdb是facebook基于leveldb實作的,目前為facebook内部大量業務提供服務。經過facebook大量工作,将rocksdb作為mysql的一個存儲引擎移植到mysql,稱之為myrocks。

下面對myrocks做一個簡單介紹,不涉及源碼。

innodb空間浪費, b tree分裂導緻page内有較多空閑,page使用率不高。innodb現有的壓縮效率也不高,壓縮以block為機關,也會造成浪費。

寫入放大:innodb 更新以頁為機關,最壞的情況更新n行會更新n個頁。rocksdb append only方式

另外,innodb開啟double write也會增加寫入。

rocksdb對齊開銷小:sst file (預設2mb)需要對齊,但遠大于4k, rocksdb_block_size(預設4k) 不需要對齊,是以對齊浪費空間較少

rocksdb索引字首相同值壓縮存儲,節省空間

rocksdb占總資料量90%的最底層資料,行内不需要存儲系統列seqid

(innodb聚簇索引列包含trxid,roll_ptr等資訊)

來看看facebook的測試資料

資料空間對比

MySQL · 特性分析 · MyRocks簡介

qps

MySQL · 特性分析 · MyRocks簡介

寫入放大對比

MySQL · 特性分析 · MyRocks簡介

資料字段資訊儲存在system column family (system cf) “system“中

資料字段資訊包括:

表資訊,表名和index id的映射

索引資訊,索引中繼資料資訊和column family id。column family和index的對應關系 1:n

column family,一些标記,比如reverse屬性等

binlog資訊

統計資訊,每個sst file都自帶統計資訊(行數、實際大小等),在flush或compaction時更新統計資訊,同時統計資訊會彙總到資料字典統計資訊表中。

以上資訊可以通過information_schema檢視,如rocksdb_ddl,rocksdb_index_file_map等

rocksdb的行以key value的形式存儲,和innodb類似,記錄格式主鍵和二級索引也有差別

MySQL · 特性分析 · MyRocks簡介

myrocks也是基于行鎖,鎖資訊都儲存在記憶體中。

myrocks也支援mvcc,mvcc通過快照的方式實作,類似于postgresql。

myrocks目前隻支援兩種隔離級别,rc和rr。

rr表現和innodb并不一樣,rocksdb 的快照不是在事務開始的時候建立,而是延遲到第一次讀的時候建立.

以下client1 myrocks傳回的是2,innodb傳回1

rc表現也不一樣,事務1大更新多行過程中,其他事務也可以更新事務還未更新到的行,事務1再更新時會失敗。

myrocks也是通過binlog方式複制,由于binlog與rocksdb之間沒有xa,異常crash可能丢資料,是以,myrocks主備環境建議開啟semi-sync.

由于gap lock支援不健全(僅primary key上支援), 使用statement方式複制會導緻不一緻,所有myrocks建議使用行級複制。

支援mysqldumup邏輯備份

同時有自動的實體備份工具myrocks_hotbackup,但還不支援備份innodb; 也不支援增量備份。myrocks_hotbackup支援流式備份

bloom filter

bloom filter一般适用于等值查詢

bloom filter資訊存儲在sst files中,大概占用2~3%的空間

如果大量查詢傳回空集建議開啟bloom filter,如果結果每次都在最底層找到,可以設定optimize_filters_for_hits=true關閉bloom filter以節省空間。

資料加載

資料加載時可以忽略唯一性限制檢查,分段自動送出,停寫wal等。

以下是推薦的資料加載時的參數配置

reverse column families

myrocks擅長正向掃描,為了提高逆向掃描(order by desc)的性能,myrocks支援了reverse column families。 在建表可以指定column family的reverse屬性。

singledelete

如果key不會重複put, delete操作可以直接删除put,而不是标記删除。singledelete可以提供查詢效率。

myrocks目前有以下一些限制

不支援分區表,online ddl,外鍵,全文索引,空間索引,表空間transport

gap lock支援不健全(僅primary key上支援), 使用statement方式複制會導緻不一緻

不支援select … in share mode

大小寫敏感,不支援*_bin collation

binlog與rocksdb之間沒有xa,異常crash可能丢資料。是以,myrocks一般開啟semi-sync.

不支援savepoint

order by 不比較慢

不支援mrr

暫不支援o_direct

innodb和rocksdb混合使用還不穩定