天天看点

MySQL · 特性分析 · MyRocks简介

rocksdb是facebook基于leveldb实现的,目前为facebook内部大量业务提供服务。经过facebook大量工作,将rocksdb作为mysql的一个存储引擎移植到mysql,称之为myrocks。

下面对myrocks做一个简单介绍,不涉及源码。

innodb空间浪费, b tree分裂导致page内有较多空闲,page利用率不高。innodb现有的压缩效率也不高,压缩以block为单位,也会造成浪费。

写入放大:innodb 更新以页为单位,最坏的情况更新n行会更新n个页。rocksdb append only方式

另外,innodb开启double write也会增加写入。

rocksdb对齐开销小:sst file (默认2mb)需要对齐,但远大于4k, rocksdb_block_size(默认4k) 不需要对齐,因此对齐浪费空间较少

rocksdb索引前缀相同值压缩存储,节省空间

rocksdb占总数据量90%的最底层数据,行内不需要存储系统列seqid

(innodb聚簇索引列包含trxid,roll_ptr等信息)

来看看facebook的测试数据

数据空间对比

MySQL · 特性分析 · MyRocks简介

qps

MySQL · 特性分析 · MyRocks简介

写入放大对比

MySQL · 特性分析 · MyRocks简介

数据字段信息保存在system column family (system cf) “system“中

数据字段信息包括:

表信息,表名和index id的映射

索引信息,索引元数据信息和column family id。column family和index的对应关系 1:n

column family,一些标记,比如reverse属性等

binlog信息

统计信息,每个sst file都自带统计信息(行数、实际大小等),在flush或compaction时更新统计信息,同时统计信息会汇总到数据字典统计信息表中。

以上信息可以通过information_schema查看,如rocksdb_ddl,rocksdb_index_file_map等

rocksdb的行以key value的形式存储,和innodb类似,记录格式主键和二级索引也有区别

MySQL · 特性分析 · MyRocks简介

myrocks也是基于行锁,锁信息都保存在内存中。

myrocks也支持mvcc,mvcc通过快照的方式实现,类似于postgresql。

myrocks目前只支持两种隔离级别,rc和rr。

rr表现和innodb并不一样,rocksdb 的快照不是在事务开始的时候建立,而是延迟到第一次读的时候建立.

以下client1 myrocks返回的是2,innodb返回1

rc表现也不一样,事务1大更新多行过程中,其他事务也可以更新事务还未更新到的行,事务1再更新时会失败。

myrocks也是通过binlog方式复制,由于binlog与rocksdb之间没有xa,异常crash可能丢数据,所以,myrocks主备环境建议开启semi-sync.

由于gap lock支持不健全(仅primary key上支持), 使用statement方式复制会导致不一致,所有myrocks建议使用行级复制。

支持mysqldumup逻辑备份

同时有自动的物理备份工具myrocks_hotbackup,但还不支持备份innodb; 也不支持增量备份。myrocks_hotbackup支持流式备份

bloom filter

bloom filter一般适用于等值查询

bloom filter信息存储在sst files中,大概占用2~3%的空间

如果大量查询返回空集建议开启bloom filter,如果结果每次都在最底层找到,可以设置optimize_filters_for_hits=true关闭bloom filter以节省空间。

数据加载

数据加载时可以忽略唯一性约束检查,分段自动提交,停写wal等。

以下是推荐的数据加载时的参数配置

reverse column families

myrocks擅长正向扫描,为了提高逆向扫描(order by desc)的性能,myrocks支持了reverse column families。 在建表可以指定column family的reverse属性。

singledelete

如果key不会重复put, delete操作可以直接删除put,而不是标记删除。singledelete可以提供查询效率。

myrocks目前有以下一些限制

不支持分区表,online ddl,外键,全文索引,空间索引,表空间transport

gap lock支持不健全(仅primary key上支持), 使用statement方式复制会导致不一致

不支持select … in share mode

大小写敏感,不支持*_bin collation

binlog与rocksdb之间没有xa,异常crash可能丢数据。所以,myrocks一般开启semi-sync.

不支持savepoint

order by 不比较慢

不支持mrr

暂不支持o_direct

innodb和rocksdb混合使用还不稳定