MyRocks_zh_doc

结构设计

使用MyRocks存储引擎时要记住有用的事情。

反向列族(用于降序扫描)

对于经常需要降序扫描的工作负载,例如: ORDER BY DESC LIMIT 100,利用反向索引列族将提高性能。要了解原因,我们需要了解一下如何在RocksDB中存储索引。

RocksDB 键可以相互兼容,请参阅此处格式的一般说明:https://github.com/facebook/mysql-5.6/wiki/MyRocks-record-format#memcomparable-format

我们在RocksDB存储引擎中有两种类型的memcmp:常规和反向。默认情况下,我们使用直接比较器,它实际上与memcmp相同。但是,如果列族名称以”rev:”开头,我们在内部使用”反向”比较器(返回-memcmp(a,b));

这种反向比较使得反向迭代范围更有效。一个原因是因为RocksDB在SST文件块中使用前缀压缩。(请参阅此处的更多信息: https://github.com/facebook/mysql-5.6/wiki/MyRocks-advantages-over-InnoDB#prefix-key-encoding) 这有点减慢了典型的反向迭代器。通过反转键的顺序,我们可以更快地进行反向迭代(例如,对于诸如select * from t1 desc limit 100之类的查询;)

重要的是要注意,由于列族的性质要么使用常规或”反向”比较器,ORDER BY ASC 或 ORDER BY DESC 对于每个列族来说都会更慢。

反向列族的示例用法。这里foo是反向列族,而bar是常规列族。

create table t1 (
  pk int primary key,
  a int not null,
  b int not null,
  key(a) comment 'rev:foo',
  key(b) comment 'bar'
) engine=rocksdb;

# fill table here...

select a from t1 order by a limit 5;

避免不覆盖二级索引扫描

InnoDB和MyRocks都使用聚簇索引和二级索引查找/扫描格式。(在此处阅读更多内容:https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html)

在MyRocks中,聚簇索引通常是表的主键(如果未明确指定隐藏主键,则会自动生成隐藏主键)。这意味着按主键查找是单步读取,例如SELECT * FROM t1 WHERE pk = 1。

MyRocks中的辅助索引包含辅助索引的memcomparable格式,后跟主键。同样,关于键格式的更多信息可以在这里找到:https://github.com/facebook/mysql-5.6/wiki/MyRocks-record-format#memcomparable-format。 由于这种格式,如果使用辅助索引的查询仅触摸辅助索引+主键字段,则无需读取聚簇索引(无需额外查找),因为所需的所有信息都已包含在密钥本身中。这也称为 覆盖索引/键读 优化。

重要的见解是在设计表的二级索引时,为了最大化索引查找/扫描效率,您应该尽量避免非覆盖二级索引扫描,因为它们会更昂贵(从PK获取其余字段的额外查找)。

目前,某些排序规则不支持仅索引扫描,有关支持这些排序规则的进度,请参阅https://github.com/facebook/mysql-5.6/issues/28。