AppBoxFuture: 二级索引及索引扫描查询数据

AppBoxFuture: 二级索引及索引扫描查询数据

  数据库索引对于数据查询的重要性不可言喻,因此作者在存储层实现了二级索引,以及利用索引进行扫描的功能。目前仅实现了分区表与非分区表的本地索引(数据与索引共用一个Raft组管理),全局索引及反向索引待以后再实现。

一、存储结构:

  在介绍索引前先了解一下数据与索引是以何种结构存储于RocksDB内的,每个节点的RocksDB实例都包含以下两个ColumnFamily,每个列簇的存储结构如下:

1. TableCF: 存储实体数据

1.1 Key存储编码:

AppBoxFuture: 二级索引及索引扫描查询数据

  • TableId包含1位排序标志用于EntityId按升序还是降序排列
  • EntityId包含实体创建时间戳,全局惟一

1.2 Value存储编码:

AppBoxFuture: 二级索引及索引扫描查询数据

  • Versions表示该条记录有多少个Mvcc版本
  • GC Flag表示第一个版本前是否被清理掉了
  • [VersionTS + DataPtr]其中VersionTS是混合逻辑时间戳,DataPtr指向此版本的数据位置,另外DataPtr=0xFFFFFFFF表示记录删除标记
  • 数据部分每100个(暂定)保存一个FullVersion的记录数据,后跟差异部分

1.3 dbscan工具输出示例:

AppBoxFuture: 二级索引及索引扫描查询数据

2. IndexCF: 存储索引数据

2.1 Key存储编码:

AppBoxFuture: 二级索引及索引扫描查询数据

  • IndexKey Values中的FieldId有一位是排序标志位
  • None unique index's EntityID表示非惟一索引指向的目标,惟一索引存在于Value内

2.2 Value存储编码:

  与TableCF的Value编码相同。

2.3 dbscan工具输出示例:

AppBoxFuture: 二级索引及索引扫描查询数据

二、索引管理:

  在新建实体模型及修改实体模型时均可添加与删除索引(如下图所示),需要注意的是修改模型时添删索引会启用异步任务变更表结构并重建索引数据(请参考之前的文章:异步结构变更),如果是重建惟一索引可能失败,在实体模型设计器内可查看索引重建状态。在索引重建过程中或重建失败后利用索引扫描数据会直接报错,告知索引尚未准备好。

AppBoxFuture: 二级索引及索引扫描查询数据

三、索引扫描:

  不同于传统Sql数据库解析Sql后利用索引扫描,服务模型的代码必须明确指定用哪个索引来查询数据,具体参考以下示例代码如何利用索引扫描数据:

AppBoxFuture: 二级索引及索引扫描查询数据

* 索引谓词目前仅实现了相等性判断,其他如大于、小于等稍后实现

* 索引扫描的附加过滤条件尚未实现

  另如果需要插入一批测试数据可参考以下示例代码:

AppBoxFuture: 二级索引及索引扫描查询数据

四、本篇小结:

  本篇介绍数据及索引的存储结构以及利用索引扫描api来查询数据,下一步作者将实现其他谓词条件,另外实现聚合扫描并优化单分区事务递交。GitHub上的运行时已更新(包括dbscan工具)可供测试。如果您有问题或Bug报告,请留言或提交Issue,另外您的关注与点赞将是作者最大的动力。


分享到:


相關文章: