- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2016-05-13 17:08 编辑
已经完成 File_mapping层的read/write初步编码设计,简单进行了数据读写,还未进行详细测试.后面还要增加动态扩展大小的功能, 目前暂时固定大小.
进入Class Block的设计,
// 设计压缩块/标准块的结构:
// 1) 块的位置号, 就是块的唯一标志, 位置号就是offset, 4字节整数, 位置号==实际存储的offset, 即该位置上读到的4字节数据==该位置的offset
// 2) 块的压缩格式及压缩率: 1字节, 0=不压缩, 1-9=lz4压缩, 21-29=gzip压缩, 31-39=bzip2, 先只做lz4, 其他备用
// 3) 块内部记录数:1字节. 每个数据块可存放1-240条记录, 标准块是一条记录一个块, 压缩块是1-240个记录一个块
这里保留了241-255的编号, 这些编号主要是为了未来(第2个版本)预留,
这些编号对应的内存结构, 在硬盘空间中没有使用,
在内存空间中使用, 将以特殊的方式, 提供高性能锁空间
每个编号将在主键上以特殊方式(类似于MVCC)提供4M个锁空间, 一共可以提供60M个锁空间,即每个table可提供最大6000万个锁空间
将用于 存储层的行锁--更新锁内部使用, 这部分代码还没有做, 但是计划在第2个版本中使用, 使用行锁以后, 将提供完整MVCC和READ COMMIT等数据库标准功能
第2个版本将实现完整的MVCC, 读取是没有任何锁, 可提供高的性能. MVCC在第一个版本中做好预留, 但是不占数据内存空间, 以便提供最好的性能
行锁是写锁,即更新锁, 正在考虑 不过都是第2个版本的事情, 这个版本只是做好预留, 按最简单的方式实现
// 3) 块的大小, 1-5字节整数, 压缩编码整数, 表示未压缩的长度
// 4) 块的大小, 1-5字节整数, 压缩编码整数 表示压缩后实际的长度,如果不压缩,同上一个值
// 5) 块的内容 0K--3.999G
// 6) 块的校验码: 8字节, 块内容crc64校验
// 7) 块的同步码 8字节
// 块的管理用掉 4+1+1+3+3+8+8=28字节 , 对于4K字节的压缩块, 大约不到1%的开销,
|
|