天天看点

myrocks 之数据字典data dictionary元数据详情rocksdb DDL 实现

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)

实际数据分布如下图:

myrocks 之数据字典data dictionary元数据详情rocksdb DDL 实现
元数据分布在系统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 删除索引数据。