数值压缩存储方面
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);
}
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);
}