技术原理
存储设计
虚谷数据库的存储引擎层采用了类似GFS的切片规则,存储与逻辑解耦。底层的组织形式是tuple->chunk,一个tuple即是一条记录(record),由多个tuple组成一个chunk,虚谷数据库的存储块按chunk进行管理,1个CHUNK为8MB(区别于GFS论文中的256MB,数据库的颗粒度不能太大,涉及到数据的迁移、资源的争用与并发等)。
如下图,Table A/B/C分别是三张不同字段数的表,各自有对应的分区规则。假设Table A 的分区Part 1具有2N条记录,经过测算,2N条记录整体大小为16MB。
按虚谷数据库CHUNK为8MB的设计,则分区Part 1占用2个CHUNK。如果存储方式采用物理轮转均衡规则,则所有表的所有CHUNK按数据载入顺序均衡存储在所有存储节点中。
由于上述设计,所以虚谷数据库在数据均衡度上较高,在数据复用率上也较高,可以一份数据应用于多个维度进行数据查询。除了上述的堆存储外(PAGE),虚谷数据库引入了B+树索引来进行加速。
索引设计
虚谷数据库默认采用B+树非聚簇索引与段页式存储的设计,加速整体的查询运行效率。如下图所示,右侧为虚谷数据库的索引设计,左侧是传统的MYSQL索引设计。此处以一个TABLE T(ID,NAME,AGE)为例,除了以ID主键外,还引入了AGE自动的非主键索引。此处如果以AGE字段作为定位件,那么传统MYSQL等聚簇索引架构,则需要回表查询,时间复杂度较高。而虚谷数据库的索引模型则只需要对AGE索引进行遍历后采用段页式定位到具体的存储位置将数据取出即可,性能较高。
虚谷数据库采用这样的设计的初衷是因为现在的业务模型越来越复杂,不仅仅是依托于主键进行查询,传统的聚簇索引查询虽然对主键查询性能好,但是整体来看性能效率比已经不足。
查询优化设计
虚谷数据库内部采用了并行调度、数据预处理、数据预分发等技术加速查询性能,尤其是在JOIN及GROUP BY分组统计场景。虚谷数据库采用了“数据向计算靠拢”的设计思想,在工作节点(SQL执行机)进行任务规划的时候,就让所有的存储节点知道自己的参与任务以及下一跳的数据推送位置。如此一来,在进行路径规划的时候,如大表与小表进行Join的时候,存储节点可以将数据提前推送到工作节点(计算引擎)的内存中,只需要扫描大表即可完成JION。除此以外,还可以根据分组情况将数据推送至后续需要进行关联分析的位置上,降低下一步的网络交换开销,增加计算效率。
精准定位设计
当前数据行业正处于高速发展的阶段中,在数据库设计方面表的字段数量越来越大(维度越来越多),此时针对宽表的部分列、部分数据的精准定位需求显得尤其重要。虚谷数据库除了采用B+树索引模型加速点查能力外,还引入了“计算向数据靠拢”的算子下推技术。
在传统数据库设计当中,存储引擎往往采用外部存储(SAN/SDS)来承接,此时如果需要查询部分列部分字段的数据的时候,往往会把整条数据都拉取到上层计算引擎中进行裁剪或者分析。本质上是因为“存储”是不带有CPU的,所以不具备计算能力。
虚谷数据库由于采用了单进程多线程模型,可以单独部署一个进程由存储任务独占PC服务器。所以此时虚谷数据库利用“SMART SCAN”技术将算子下沉到存储中进行本地化裁剪,最后返回少量数据,实现精准查询的效率提升。如下图,例举了一条SQL“SELECT ID,NAME FROM STUDENT WHERE ID < 4 AND NAME ='xg' ;”,该STUDENT表有若干字段,仅取部分字段的情况。