MyRocks管理很多内部信息,例如索引id和列族id之间的映射,在我们称之为数据字典的内部。 MyRocks将所有的数据字典条目存储在名为__system__的专用RocksDb列族中。我们称之为系统列族(System CF) 系统CF与应用程序使用的列族分开。出于调试目的,MyRocks提供了information_schema表打印数据字典条目。
以下是一些有助于理解MyRocks数据字典的概念:
* 列族ID:这是RocksDB中列族的ID。每个MyRocks索引属于一个列族。多个索引可以属于一个列族。因此列族和索引之间1:N映射。
可以通过设置索引COMMENT语法来指定列族名称。
* 索引ID:这是MyRocks内部自动生成的内部ID。每当创建新索引时,都会分配新的索引ID。创建新索引时会分配索引ID。
索引ID按顺序递增,不会在不同索引之间重复使用。这意味着您无法再同一个MyRocks实例中创建超过2^32个索引。
全局索引ID: 列族ID + 索引ID
1、表名 ==> 内部索引id映射
key: Rdb_key_def::DDL_ENTRY_INDEX_START_NUMBER(0x1)+ dbname.tablename
value: version + {global_index_id}*n_indexes_of_the_table
更新索引定义时更新此字典 -- 添加/删除 表/索引。版本是内部数据字典版本(当前硬编码为0x1)并使用2个字节。字典id是4个字节。全局索引id是8个字节。
2、索引信息
key: Rdb_key_def::INDEX_INFO(0x2) + global_index_id
value: version, index_type, key_value_format_version
创建新索引时会插入一行。删除索引时, 将删除匹配的行。index_type是1个字节。目前,它用于区分主键和辅助索引。key_value_format_version是2个字节。
更改格式时,版本号将增加。这是为了保持兼容性更容易。
3、CF id => 列族 flags标志
key: Rdb_key_def::CF_DEFINITION(0x3) + cf_id
value: version, {is_reverse_cf, is_auto_cf, is_per_partition_cf}
创建新列族时插入一行。删除列族时,将删除匹配的行。cf_flags总共是4个字节。目前只使用三位。
4、binlog条目 (在提交时更新)
key: Rdb_key_def::BINLOG_INFO_INDEX_NUMBER (0x4)
value: version, {binlog_name,binlog_pos,binlog_gtid}
此字典条目最多只有一条记录,并在事务提交(binlog commit)中更新。如果禁用二进制日志,则不会更新此条目。
binlog name和binlog gitd是2个字节长度编码的。并且不以null结尾。binlog pos是4个字节。
5、正在进行的丢弃索引条目
key: Rdb_key_def::DDL_DROP_INDEX_ONGOING(0x5) + global_index_id
value: version
引入数据字典条目以支持MyRocks中的"快速删除/清空表(fast drop/truncate table)"功能。
删除表(索引)时,MyRocks会将目标索引添加到此数据字典中,然后客户端可以非常快速地获得回复响应---无需等待完成删除表。
MyRocks后台调度压缩过滤器,定期检查行,如果删除了与索引关联的所有行,则会从此数据字典中删除索引ID。
6、索引统计
key: Rdb_key_def::INDEX_STATISTICS(0x6) + global_index_id
value: version, {materialized PropertiesCollector::IndexStats}
如果需要更改索引统计信息,则 添加/更新/删除 此数据字典。
7、当前最大索引ID
key: Rdb_key_def::CURRENT_MAX_INDEX_ID(0x7)
value: version, current max index id
创建新索引时会更新此数据字典。
8、正在进行创建索引条目
key: Rdb_key_def::DDL_CREATE_INDEX_ONGOING(0x8) + global_index_id
value: version
引入此数据字典条目以支持MyRocks中的"快速二级索引创建"。在MyRocks中创建索引时,此条目将更新,并在索引创建完成后删除。
它的主要用途是在崩溃恢复期间,如果发现任何部分创建的索引,则会在启动时从RocksDB中删除其条目。
数据字典操作在RocksDB中是原子的。例如,在创建具有两个索引的表时,需要调用Put三次,而MyRocks使用单个WriteBatch执行它。