MyRocks_zh_doc

MyRocks 数据字典格式

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 

MyRocks 数据字典模型

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执行它。