开发者社区> zysql> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

myrocks记录格式分析

简介: --- title: MySQL · myrocks · myrocks记录格式分析 author: 张远 --- # 概况 rocksdb作为KV存储引擎,那么myrocks记录最终会以kv的形式存储在rocksdb中。MySQL中的表一般由若干索引组成, 在innodb存储引擎中,每个索引对应一颗B树,而在rocksdb存储引擎中,索引对应于rocksdb中一段连续范围的数据。
+关注继续查看

title: MySQL · myrocks · myrocks记录格式分析

author: 张远

概况

rocksdb作为KV存储引擎,那么myrocks记录最终会以kv的形式存储在rocksdb中。MySQL中的表一般由若干索引组成, 在innodb存储引擎中,每个索引对应一颗B树,而在rocksdb存储引擎中,索引对应于rocksdb中一段连续范围的数据。
具体来说,这个范围是此索引id和id+1之间的所有数据。如果表的所有索引都在一个column family, 那表的这些索引数据在物理上基本是连续的。
可以参考之前文章中的图示

myrocks记录格式

myrocks以索引为单位,将表的所有索引分别存储在rocksdb中。
根据索引的类型,myrocks记录的格式有所不同。下面以下表不同索引类型来分别介绍

CREATE TABLE t1(a INT, 
                b VARCHAR(20), 
                c char(5), 
                d int, 
                pk INT AUTO_INCREMENT, 
                PRIMARY KEY(pk) comment 'cf_1', 
                unique key idx2(b) comment 'cf_2') 
                engine= rocksdb;
                
INSERT INTO t1 (pk,a,b,c) VALUES (1,1,'bbbbbbbbbb','c');
  • 主键
    主键索引记录kv结构如下
  key: index_id, M(pk)
  value: unpack_info, NULL-bitmap,b,c,d

key由索引id和主键组成。 index_id是索引的唯一标识占用4个字节,M(pk) 表示pk转化后的数据,此转化后的数据可以直接用于memcmp比较

rocksdb数据都是根据key排序的,为了便于比较,不同类型数据都会经过一些转化,转化后可以直接用于memcmp比较。
关于memcmp转化,下一节会详细介绍

value存储unpack_info和非主键外的其他字段数据, Null-bitmap标识哪些字段为空。

unpace_info存储将M(pk)逆转化为pk的信息,如果不需要额外转换信息则unpace_info为null,此例中pk为int类型,不需要额外信息unpace_info为null

  • 二级索引 idx2
    二级索引记录kv结构如下
  key: index_id,NULL-byte, M(b),M(pk)
  value: unpack_info

key由index_id,二级索引键和主键组成, 其中NULL-byte表示b是否为空。pk为主键非空,所以不需要NULL-byte
value只有unpack_info,表示 M(b),M(pk)逆转化信息,如果不需要额外转换信息则unpace_info为null。此例中b为varchar类型,需要额外信息unpace_info不为null

唯一索引和普通二级索引存储方式没有区别
联合索引每多一个字段会在字段前增加一个NULL-byte,来表示此字段是否为空

Memcomparable format

rocksdb为了比较方便,将key字段转化为可以直接memcmp比较的形式。所以MyRocks 一般建议使用sensitive collations (latin1_bin, utf8_bin, binary).
这样可以避免转化的开销。

  • 整形

整形转化比较简单,但对于有符号类型需要特殊处理,如果直接存储会导致比较是负数比正数大。
这里对有符号类型处理的方式是将符号位反转,这样正数就比负数大了,
关键代码段如下

Field_long::make_sort_key:

if (!table->s->db_low_byte_first)  
{
  if (unsigned_flag)
    to[0] = ptr[0];
  else
    to[0] = (char) (ptr[0] ^ 128);            /* Revers signbit */
  to[1]   = ptr[1];                
  to[2]   = ptr[2];                
  to[3]   = ptr[3];                
}
  • 字符型

char类型直接补空格

varchar类型为了节省空间处理起来就复杂多了
以源码中的注释为例

const int VARCHAR_CMP_LESS_THAN_SPACES = 1;
const int VARCHAR_CMP_EQUAL_TO_SPACES = 2;
const int VARCHAR_CMP_GREATER_THAN_SPACES = 3;

 Example: if fpi->m_segment_size=5, and the collation is latin1_bin:

  'abcd\0'   => [ 'abcd' <VARCHAR_CMP_LESS> ]['\0    ' <VARCHAR_CMP_EQUAL> ]
  'abcd'     => [ 'abcd' <VARCHAR_CMP_EQUAL>]
  'abcd   '  => [ 'abcd' <VARCHAR_CMP_EQUAL>]
  'abcdZZZZ' => [ 'abcd' <VARCHAR_CMP_GREATER>][ 'ZZZZ' <VARCHAR_CMP_EQUAL>]

字符串以m_segment_size分段存储,每段前m_segment_size-1个字符是内容,最后一个字符表示和空格比较,VARCHAR_CMP_EQUAL同时也表示字符串结束

例子中m_segment_size为5,实际实现上值为9

这里unpace_info会比较复杂,字符串collation不同unpace_info也不同,unpace_info需要保存collation之间的转换映射关系,
具体可以查看函数(rdb_init_collation_mapping)

rocksdb内部记录格式

前面为我们看到的是进入rocksdb之前记录的kv结构形式,实际上数据存储到rocksdb后key还要进一步封装
进入rocksdb之前的key称为userkey, rocksdb内部称为internalkey

internalkey=| User key (string) | sequence number (7 bytes) | value type (1 byte) |

其中sequence number 是记录序列号,每个记录sequence number根据是以记录进入rocksdb先后顺序递增的。
sequence number是实现rocksdb事务处理的关键,这个下次讨论。

value type是记录的类型,put, merge,delete等

示例

以实例来说明比较直观,还是上面介绍的那个表,插入一条记录,来看看记录的具体结构

INSERT INTO t1 (pk,a,b,c) VALUES (1,1,'bbbbbbbbbb','c');

查看主键index_id为260,二级索引index_id为261

select * from INFORMATION_SCHEMA.ROCKSDB_DDL where TABLE_NAME='t1';
TABLE_SCHEMA    TABLE_NAME      PARTITION_NAME  INDEX_NAME      COLUMN_FAMILY   INDEX_NUMBER    INDEX_TYPE      KV_FORMAT_VERSION       CF
test    t1      NULL    PRIMARY 2       260     1       11      cf_1
test    t1      NULL    idx2    3       261     2       11      cf_2
  • 主键记录

    • key
      screenshot
    • value
      screenshot
  • 二级索引记录

    • key
      screenshot
    • value
      screenshot

这里包字段b的空格信息和collation转化映射关系。比较复杂,不详细展开,有兴趣的可以查看函数(rdb_init_collation_mapping)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MyRocks TTL特性介绍
# 概述 MyRocks TTL(Time To Live) 特性允许用户指定表数据的自动过期时间,表数据根据指定的时间在compact过程中进行清理。 MyRocks TTL 简单用法如下, 在comment中通过ttl_duration指定过期时间,ttl_col指定过期时间列 ``` CREATE TABLE t1 ( a bigint(20) NOT NUL
4307 0
MyRocks相关tools介绍
--- title: MySQL · myrocks · myrocks相关tools介绍 author: 张远 --- # 概述 MyRocks提供了丰富的tools,如sst_dump, mysql_ldb等,这些工具对我们的运维和分析问题非常有用。 sst_dump 可以导出sst中的数据和属性信息。 ``` sst_dump --help sst_dump
1960 0
MyRocks之bloom filter
--- title: MySQL · mysql · myrocks之Bloom filter author: 张远 --- # Bloom filter 简介 Bloom filter用于判断一个元素是不是在一个集合里,当一个元素被加入集合时,通过k个散列函数将这个元素映射成一个位数组中的k个点,把它们置为1。检索时如果这些点有任何一个为0,则被检元素一定不在;如果都是1,则
2301 0
MyRocks简介
--- title: MySQL · 特性分析 · MyRocks简介 author: 济天 --- RocksDB是facebook基于LevelDB实现的,目前为facebook内部大量业务提供服务。经过facebook大量工作,将RocksDB作为MySQL的一个存储引擎移植到MySQL,称之为MyRocks。 经过两年的发展,MyRocks已经比较成熟(RC阶段),现已进入了
2470 0
MyRocks监控信息
--- title: MySQL · myrocks · myrocks监控信息 author: 张远 --- rocksdb本身提供了丰富的监控信息,myrocks通过information_schema下的表和show命令等将这些信息展示出来,下面主要以示例的形式来简单介绍下 先创建测试表 ``` CREATE TABLE t1 (a INT, b CHAR(8), pk
2059 0
MySQL · myrocks · myrocks之备份恢复
myrocks支持逻辑备份和物理备份,逻辑备份仍然采用mysqldump,物理备份采用自己开发的myrocks_hotbackup工具,传统的物理备份工具Xtrabackup不支持rocksdb。由于rocksdb的存储特性,myrocks不管是逻辑备份还是物理备份,与innodb的备份恢复均有较大差别。 逻辑备份 myrocks的mysqldump工具支持rocksdb的逻辑备份,其使用方式
3048 0
MySQL · myrocks · myrocks之事务处理
前言 mysql目前支持的事务引擎有innodb,tokudb。 rocksdb加入mysql阵营后,mysql支持的事务引擎增长至3个。 myrocks目前支持的事务隔离级别有read-committed和repeatable-read。 同innodb一样,myrocks也支持MVCC机制。 可以说,myrocks提供了很好的事务支持,能够满足的一般业务的事务需求。 sequence n
2281 0
myrocks统计信息
--- title: MySQL ・ myrocks ・ myrocks统计信息 author: 张远 --- # 概述 mysql查询优化主要是在代价统计分析的基础上进行的。合理的代价模型和准确的代价统计信息决定了查询优化的优劣。myrocks基于mysql5.6, 目前的代价模型依赖的主要因素是IO和CPU,mysql5.7及以上的版本代价模型做了较多改进,具体可以参考[这里](
2091 0
MyRocks简介
--- title: MySQL · 特性分析 · MyRocks简介 author: 济天 --- RocksDB是facebook基于LevelDB实现的,目前为facebook内部大量业务提供服务。经过facebook大量工作,将RocksDB作为MySQL的一个存储引擎移植到MySQL,称之为MyRocks。 经过两年的发展,MyRocks已经比较成熟(RC阶段),现已进入了
6560 0
+关注
zysql
张远 MySQL/MyRocks
34
文章
10
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载