title: mysql · myrocks · data dictionary 分析
rocksdb作為mysql的一個新的存儲引擎,在存儲引擎層,會維護自動的中繼資料資訊。在innodb存儲引擎中,我們通過information_schema下的innodb_sys_datafiles,innodb_sys_tables,innodb_sys_indexes等表,
可以窺視innodb的中繼資料資訊。同樣,rocksdb通過information_schema下的rocksdb_index_file_map,rocksdb_ddl,rocksdb_global_info等表可以檢視原資料資訊。
下面我盟來具體看看rocksdb維護了哪些中繼資料資訊,從源碼中看定義了以下類型,這些資料都以kv的形式存儲在名叫__system__系統column family中。
ddl_entry_index_start_number
表和索引之間的映射關系
key: rdb_key_def::ddl_entry_index_start_number(0x1) + dbname.tablename
value: version + {global_index_id}*n_indexes_of_the_table
index_info
索引id和索引屬性的關系
key: rdb_key_def::index_info(0x2) + global_index_id
value: version, index_type, key_value_format_version
index_type:主鍵/二級索引/隐式主鍵
key_value_format_version: 記錄存儲格式的版本
cf_definition
column family屬性
key: rdb_key_def::cf_definition(0x3) + cf_id
value: version, {is_reverse_cf, is_auto_cf}
is_reverse_cf: 是否是reverse column family
is_auto_cf: column family名字是否是$per_index_cf,名字自動由table.indexname組成
binlog_info_index_number
binlog位點及gtid資訊,binlog_commit更新此資訊
key: rdb_key_def::binlog_info_index_number (0x4)
value: version, {binlog_name,binlog_pos,binlog_gtid}
ddl_drop_index_ongoing
等待删除的索引資訊
key: rdb_key_def::ddl_drop_index_ongoing(0x5) + global_index_id
value: version
index_statistics
索引統計資訊
key: rdb_key_def::index_statistics(0x6) + global_index_id
value: version, {materialized propertiescollector::indexstats}
max_index_id
目前的index id,每次建立索引index id都從這個擷取和更新
key: rdb_key_def::current_max_index_id(0x7)
value: version, current max index id
ddl_create_index_ongoing
等待建立的索引資訊
key: rdb_key_def::ddl_create_index_ongoing(0x8) + global_index_id
這裡以建表和删表來舉例
create table
通過以下步驟建表
另外,建索引時,會更新max_index_id資訊,使用單獨的batch寫入,參考(rdb_seq_generator::get_and_update_next_number)
實際資料分布如下圖:

中繼資料分布在系統column family __system__中 primary key 分布在column family default中 idx1 分布在column family cf_1中 黃線之間代表資料分布的範圍
drop table
batch->put 将索引加入到待删的kv隊列中
{ddl_drop_index_ongoing(4)+cf_id(0)+index_id(260)} --> {ddl_drop_index_ongoing_version(2)}
{ddl_drop_index_ongoing(4)+cf_id(2)+index_id(261)} --> {ddl_drop_index_ongoing_version(2)}
batch->delete 删除表的映射關系
表和索引的映射關系
背景線程再從待删的kv隊列取出待删的索引,通過 deletefilesinrange, compactrange 删除索引資料。