成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RocksDB數據存儲格式分析

存儲
RocksDB本身只是一個KV存儲,用戶通過put(key,value)來寫入key,或者通過get(key)接口來獲取value,所以單從RocksDB而言,每條記錄都是一個key-value。那么當RocksDB作為一個存儲引擎接入到MySQL時,key-value結構如何存儲表中各個索引,以及如何記錄中各個列的信息是本文要具體討論的。

RocksDB本身只是一個KV存儲,用戶通過put(key,value)來寫入key,或者通過get(key)接口來獲取value,所以單從RocksDB而言,每條記錄都是一個key-value。那么當RocksDB作為一個存儲引擎接入到MySQL時,key-value結構如何存儲表中各個索引,以及如何記錄中各個列的信息是本文要具體討論的。

RocksDB引擎與InnoDB引擎類似,也是采用索引組織表,無論是表(主鍵索引)還是二級索引都是以LSM tree方式組織,RocksDB記錄主要包括三部分,key,value和meta三部分內容,具體見下表,后面通過介紹一條具體記錄在RocksDB引擎中的存儲格式再做詳細說明。

我們創建表,并寫入數據,如下:

  1. create table row_format(   
  2.     id int not null,   
  3.     c1 int,   
  4.     c2 char(10) not null,   
  5.     c3 char(10),   
  6.     c4 varchar(10),   
  7.     c5 varchar(10) not null,   
  8.     c6 blob,   
  9.     c7 binary(10) not null,   
  10.     c8 varbinary(10)) 
  11. engine=rocksdb; 
  12.  
  13. insert into row_format(id,c2,c4,c5,c7) values(1,'abc','abc','efg','111'

 

Key部分

由于表沒有主鍵,所以實質是rowid:

實際數據:

index_id:索引的編號,全局唯一。

rowid:由于表沒有主鍵,系統會產生一個bigint類型的rowid作為主鍵,占用8個字節,而InnoDB引擎的rowid占6個字節,需要注意的是rowid存儲采用的大端的存儲(高位存儲低字節),這里主要是為了memcompare。

Value部分

說明:

  • Value的最前面部分(0x1b)就是存放記錄的null信息。根據記錄中可以為null字段的個數,確認需要占用的字節數,如果小于8個,則只需要一個字節。例子中,c1,c3,c4,c6,c8均可以為null,因此需要5個bit,所以用1個byte表示Null-flag即可,由于插入記錄中,c4不為null,則對應的bit為0,也就是0x00011011。
  • 對于null,無論是定長還是非定長數據類型,都不占用真實的存儲空間,只需要一個bit位來表示為null即可。
  • 空串’’與null,上面提到了null需要占一個標記位,而對于’’,如果是變長字段仍然需要存儲長度信息,對于定長字段,則會補全。
  • 對于變長字段,比如varchar,0x03    0x61    0x62    0x63數據有len+data組成,如果數據長度小于256,len只需要占用一個byte;如果len大于255,且小于65536,則需要占用2個字節,對于longblob類型,則需要占4個字節。
  • 對于定長字段,不需要存長度信息直接存儲data,如果不足則補充。補充字符有點詫異,對于char類型,補充0x20,對于binary類型,補充0x00。
  • 對于lob類型,比如tinyblob,blob,mediumblob,longblob,以及對應的text類型,處理策略與varchar類似,存儲長度的字節數根據數據類型的范圍確定,比如blob長度占用2個字節,而longblob的長度占4個字節。所以在rocksdb里面,沒有innodb中所謂“溢出頁”的概念。對于innodb引擎,如果blob字段內容超過768字節,多余的data存儲在溢出頁,頁內通過20個字節指向溢出頁,主要包括第一個blob頁的space_id,page_no和起始偏移,如果存在多個blob頁,則頁與頁之間通過類似的方式進行關聯。具體可以參考btr0cur.h文件中關于BTR_EXTERN_xxx相關的宏定義,以及接口btr_copy_externally_stored_field_prefix_low。
  • 有關value部分的存儲實現可以參考rocksdb引擎接口 convert_record_to_storage_format,convert_record_from_storage_format和innodb引擎接口row_mysql_store_col_in_innobase_format,row_sel_field_store_in_mysql_format。

meta部分

meta部分主要是SequenceID,這個SequenceID在事務提交時產生,主要用于RocksDB實現MVCC,用于可見性判斷,此外meta中還包含flag信息,由于標示記錄類型,put,delete,singleDelete等,具體而言Sequence占7個字節,flag占1個字節。

RocksDB索引格式

RocksDB中,所有的數據都是通過索引來組織,與InnoDB類似,也是索引組織表,每個索引有一個全局唯一的index_id。索引主要包括兩類:主鍵索引和二級索引,前面介紹的記錄格式,也就是主鍵索引的格式,包括key,value和meta三部分。二級索引也包含key,value和meta三部分,但是value中不包含任何數據,只是包含checksum信息。

主鍵索引 

二級索引

對比InnoDB引擎(innodb_file_format=Barracuda,row_format=compact)

InnoDB記錄格式

我們仍然以上面的表結構來看看InnoDB的存儲格式。

  1. create table row_format(   
  2.     id int not null,   
  3.     c1 int,   
  4.     c2 char(10) not null,   
  5.     c3 char(10),   
  6.     c4 varchar(10),   
  7.     c5 varchar(10) not null,   
  8.     c6 blob,   
  9.     c7 binary(10) not null,   
  10.     c8 varbinary(10)) engine=innodb; 
  11.  
  12. insert into row_format(id,c2,c4,c5,c7) values(1,'1234','ab','efg','111'); 

記錄內容

說明

  1. 03 02 0a,這里存的是長度信息,所有非null的變長列信息都逆序存在一起,這里按先后順序是c5,c4,c2,這里innodb將char(10)也當作變長字段處理了。
  2. 1b存儲的是null信息,與rocksdb對null處理一致。00 00  18 ff b5存儲的是record-header。
  3. 00 00 00 00 28 00 00 00 00 01 01 03 83  00 00 01 36 01 10, 這三部分別是rowid,trxid和roll_ptr,分別占6個字節,6個字節和7個字節。
  4. 最后一部分是數據,null不占任何存儲空間,與rocksdb處理類似。

整體而言,InnoDB記錄格式包含了record_header(記錄頭信息),占5個字節,主要包括記錄號(heap_no),列數目,下一條記錄的位置以及是否刪除等信息。RocksDB則相對簡單,只有整體的value-size,以及通過Meta中flag標示記錄的狀態put 或者是delete。InnoDB將變長列長度信息集中存放在一起,使得查找任意列的代價都差不多,而RocksDB的變長列信息則是放在每列的前面,訪問最后一列需要逐一計算前面的列,才能定位。此外,由于InnoDB引擎與RocksDB引擎由于實現MVCC的機制不同,導致InnoDB引擎和RocksDB引擎需要存儲的額外信息也不同。InnoDB實現MVCC依賴于回滾段信息,記錄需要額外存儲trxid和roll_ptr兩個字段,分別是6個字節和7個字節(type,rsegid,pageNO,offset),其中type占一個bit位,標示insert 或者是update類型,rsegid回滾段id占7bit位,pageNo占4個字節,頁內偏移占2個字節。RocksDB實現MVCC則是依賴于SequenceID,通過SequenceID來判斷記錄的可見性,SequenceID占7個字節。

細節上來說,RocksDB引擎和InnoDB引擎在處理null,char和varchar的方式類似,但InnoDB對于char類型做了優化,統一作為varchar處理。另外RocksDB引擎沒有對blob做特殊處理。你可能會有疑問,RocksDB不是也有block_size嗎,如果設置為16k,blob數據超過16k怎么辦?對于InnoDB而言,由于表實質是以一個個page通過B-tree組織起來的,每個page是固定大小,當記錄非常大時,就需要借助溢出頁,通過鏈接的方式關聯起來。而RocksDB中block_size只是一個壓縮單位,并沒有嚴格約束,文件內容以block組織,由于文件中block可能是壓縮過的,因此每個block的大小不固定,通過偏移來定位具體某個block的位置。如果遇到大的blob數據,則可能這個block比較大,記錄所有數據存儲在一起,不會跨block。

對于索引長度限制也有所不同,對于InnoDB引擎來說,索引中單列長度不能超過767個字節,而RocksDB引擎單列長度不超過2048個字節,具體可以參考max_supported_key_part_length各自的實現;整個索引的長度,RocksDB和InnoDB都限制在3072個字節,實際上是server層的限制,因為它們的各自限制的長度都比server層的大。

 

責任編輯:武曉燕 來源: 阿里巴巴數據庫技術
相關推薦

2021-12-11 08:05:12

FlinkRocksDB數據

2023-09-06 15:00:35

Pandas存儲格式

2018-07-04 09:30:55

列式存儲格式

2011-12-29 09:33:38

云計算云存儲

2022-06-08 07:34:02

持久化數據存儲原理索引存儲格式

2022-08-31 08:04:08

Ceph配置選項

2024-12-12 09:24:28

RocksDB服務器

2020-03-03 13:42:08

數據存儲數據存儲

2024-09-03 08:40:31

2009-09-21 18:00:49

Hibernate X

2012-08-17 10:35:17

云計算存儲大數據

2019-11-26 09:56:48

Python數據存儲

2016-12-01 14:47:20

2017-07-04 10:58:57

SAN存儲網絡存儲系統架構

2010-07-09 10:42:38

HART協議

2014-05-13 14:11:36

GoRedis

2019-05-28 10:32:29

TCPUDP SYN

2015-12-15 10:51:14

軟件定義存儲數據中心

2014-03-24 10:54:10

大數據分析

2018-05-23 08:39:18

AlluxioCeph對象存儲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产高清在线精品 | 97伦理| 日日天天| 中文字幕一区二区三区四区五区 | 久久一区视频 | 国产高清精品一区二区三区 | 国产片侵犯亲女视频播放 | 精品久久久久久久久久 | 国产一区二区在线播放 | 一区二区国产在线 | av香蕉| 91精品国产一区二区三区香蕉 | 久久久久精 | 亚洲高清视频一区二区 | 91porn国产成人福利 | 免费一区二区 | 欧美一级二级在线观看 | 欧美区日韩区 | 99精品视频一区二区三区 | 国产在线视频一区 | 久久久高清 | 亚洲人成网站777色婷婷 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 黄a在线观看 | 亚洲一区影院 | 国产欧美精品一区二区色综合 | 日日操夜夜操天天操 | 午夜在线视频 | www.youjizz.com日韩| 日韩av三区 | 欧美片网站免费 | www.av在线| 欧美男人天堂 | 亚洲一区二区中文字幕 | 国产福利91精品一区二区三区 | 欧美日韩精品中文字幕 | 成人福利视频 | 一级二级三级在线观看 | 亚洲一级视频在线 | 91精品久久久久久久久中文字幕 | wwww.8888久久爱站网 |