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,a,b,c,d


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


var_field是如何实现的(明白了这个才能继续后面的工作)
比如:varchar是以由data_len+data构成一个数据的,这样就可以动态存储数据了,而对于varchar来说data_len长度为2或1


数值压缩存储方法
在MySQL一张表创建好了,那么field_length也就固定了,而innodb对data_len没有做处理,直接存储,
这样在存blob的时候很费存储,所以我们就有了倒序存储的想法,每取7位,如果后面还有数据则最高为置1,这样把data_len明显的压缩了


inline char* encode_varint64(char* dst, uint64_t v) {
     static const unsigned int B = 128;
     unsigned char* ptr = reinterpret_cast<unsigned char*>(dst);
     while (v >= B) {
        *(ptr++) = (v & (B - 1)) | B;
        v >>= 7;
     }
    *(ptr++) = static_cast<unsigned char>(v);
    return reinterpret_cast<char*>(ptr);
 }


inline char* encode_varint64(char* dst, uint64_t v) {
     static const unsigned int B = 128;
     unsigned char* ptr = reinterpret_cast<unsigned char*>(dst);
     while (v >= B) {
        *(ptr++) = (v & (B - 1)) | B;
        v >>= 7;
     }
    *(ptr++) = static_cast<unsigned char>(v);
    return reinterpret_cast<char*>(ptr);
 }

猜你喜欢

转载自blog.csdn.net/qq948993066/article/details/80006197
今日推荐