存储引擎是数据库核心部件之一,YashanDB通过不同的存储引擎适应不同的应用场景,以获得面向在线交易场景的高效事务处理能力,面向实时分析场景的事务与分析均衡能力,以及面向海量稳态数据分析场景的高性能。
YashanDB支持的存储结构有:HEAP,BTREE,MCOL,SCOL。
基于不同的存储结构,YashanDB支持的存储对象类型有行存表,列存表以及BTree索引:
表空间是可以给表、索引实体对象分配空间的容器。
YashanDB将数据库的存储空间划分为若干表空间,表空间之间互相隔离。每个表空间采用段页式或对象式管理存储空间。
段页式表空间的段类型有数据段、索引段、回滚段等不同类型的逻辑段,逻辑段采用数据区和数据块的方式管理空间,使得空间使用更加灵活,管理更加高效,使用率更高。


系统采取多线程写、IO合并、IO排序等优化手段提升落盘效率。同时,YashanDB引入双写机制,避免在服务器掉电等意外场景下可能出现的半写问题,严格保证数据完整性。
对象式表空间的对象类型有切片元数据对象、列式数据对象等,对象采用物理文件的方式进行管理,一个对象写入一个文件,使得数据在磁盘上连续存储,有着高效的读取性能,且对压缩编码友好。
SCOL格式的数据将以切片(Slice)文件的形式持久化存储到对应的数据桶(DataBucket)中,Databucket数据桶是一组数据文件目录组成一个Tablespace的对象式空间,支持指定本地磁盘或云端存储。
HEAP存储以无序的方式进行组织和存储数据。用户增/删/改/查操作的记录,按数据行(Row)格式组织和存储。Row格式中描述每个列字段的长度,支撑包含变长列(VARCHAR、LOB等)字段的数据行存储,每个数据行按照列声明的顺序进行顺序存储。
堆式存储维护一个空闲空间管理结构,当需要写入数据时,堆式存储将在空间中快速找到一个合适的位置进行写入。由于不需要维护数据有序,写入是一个高效的过程,适用于行表的高速插入。

在update某一个行式变长列字段时,系统采取如下几种不同的存储方式:

列字段长度在更新后变小时,将行变短,在原位置重组行;变大时,将行变长,页面free空间足够时在本页面重组行。


BTREE是一种多叉平衡查找树,是按键值有序存储的架构。BTREE存储结构采用B-Link Tree,树的节点以块为单位,定义树的最底层为0层,0层的块称为叶子块(leaf block),层级大于0的块称为分支块(branch block),树的最顶层只有一个块,称为根块(root block,是一个特殊的branch block)。
BTREE存储结构用于存储BTree索引,BTree索引在单个Block中存储的索引行是有序的,不同Block之间仍是有序的,保证了整个BTree索引是有序的。

可变列式存储区采用可变列式存储(MCOL,Mutable Columnar Storage)的存储格式进行存储。MCOL是一种基于段页式管理的列式存储结构,以支持实时业务,其最小访问数据单元为Block。
可变列式存储格式由元数据管理段(Meta Management Segment)、事务管理段(Transaction Management Segment)、定长数据段(Fix Col Segment)以及变长数据段(Var Col Segment)等多个数据段组成:

MCOL中,列被细分为一个或多个数据段,每个列的数据集中连续存储并实现原地更新(in-place update)。相对于HEAP存储结构的全表查询,MCOL既提升了投影操作的查询速度,又实现了快速原地更新。
in-place update
传统的分析型数据库采用列式存储时,插入和更新操作都是在末端插入一个新值并标记被替代的数据。而MCOL则实现了原位更新(in-place update),避免了在存储区域产生“墓碑”,避免了空间膨胀与垃圾扫描,有效地提升了存储和检索数据的效率。

列式变长列存储:MCOL对变长字段(例如LOB、VARCHAR等)的存储采用列式存储或行列结合技术,每列单独拥有一个或多个Segment。

变长字段的数据如果用到了HEAP存储,则沿用HEAP存储结构,实现对列式数据的高效删改,同时,通过RowId逻辑映射结构实现行列对应和Batch分批事务处理,保持列式数据的批量增查优势。
稳态列式存储区采用稳态列式存储(SCOL,Stable Columnar Storage)的存储格式进行存储。SCOL是一种基于对象式管理的列式存储结构,以支持海量数据的存储。
SCOL中,每个列分成若干个对象,每个对象以文件的形式连续存储于磁盘目录中,通过预加载或实时加载的方式缓存到内存Cache中。不同对象之间根据数据类型的差异,支持选择最优的压缩以及编码方式,以节省存储空间和提高访问速度。

SCOL格式数据相比于MCOL数据,具备更优秀的查询性能,通过配置MCOL TTL可以配置可变数据保留时间,配置较小的MCOL TTL可使数据尽快转为稳态数据,提升查询性能。
MCOL格式数据在通过后台转换任务(Transform in background)压缩后会转换为SCOL格式,后台转换任务对业务层的查询请求透明,查询请求获取到的MCOL格式数据和SCOL格式数据会先合并再呈现给用户,并满足事务要求。后台转换任务支持分批次进行活跃/稳态切片自动转换,数据增量写入时以活跃切片形式进行数据存储,当达到一定条件后通过后台转换任务分批转换为稳态切片存储。
行存表采用HEAP存储结构,数据以Row的格式进行组织并存储于HEAP存储区。每个数据行中的数据均以变长形式存储,Row格式里面每列数据按照“数据长度 + 实际数据”的形式组织排布。
TAC表采用MCOL存储结构,以支持实时业务。
LSC表数据以切片形式(Slices)进行组织,其切片分为活跃切片(Active Slices)和稳态切片(Stable Slices)。
在典型的联机分析处理OLAP应用中,数据在刚写入后的一段时间内是不稳定的,需要对其进行一定程度的更新/删除,例如勘误或校对数据、剔除噪点等数据清洗操作。过了这段时间后,数据不再需要进行更新,进入一个相对稳定的状态,用于业务模型分析、商业智能等分析工作。在YashanDB概念体系文档中,为方便读者更好地理解,我们将需要频繁更新/删除的数据称为“热数据”,将无需频繁更新/删除的相对稳定的数据称为“冷数据”。
LSC表会根据用户输入自动判断数据的冷热,默认使用活跃切片存储热数据、稳态切片存储冷数据(在后续的描述中均使用默认存储方式)。用户也可以根据实际需求进行自定义调整,例如冷热数据均采用稳态切片存储,但可能会对性能产生一定的影响。

访问LSC表数据时,根据Entry Block查询到表数据组织情况,再通过对应的Slices进行下一级数据扫描。
数据库可以通过创建索引加速数据访问,索引是一种与表关联的数据结构。在表上创建合适的索引,可以减少需要访问的行数以及I/O,从而极大的提升业务性能。
BTree索引是数据库中最常见的、应用最广泛的索引(通常而言,索引就是指B树索引),也是YashanDB数据库默认的索引类型,采用BTREE存储结构。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。