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

一、存储结构:

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

1. TableCF: 存储实体数据

1.1 Key存储编码:

TableId(with OrderFlag) EntityId
32bit 128bit
  • OrderFlag用于EntityId按升序还是降序排列
  • EntityId包含实体创建时间戳,全局惟一

1.2 Value存储编码:

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

1.3 dbscan工具输出示例:

2. IndexCF: 存储索引数据

2.1 Key存储编码:

TableId IndexId IndexKey Values None unique index's EntityId
32bit 8bit [FieldId + Value] 128bit
  • IndexKey Values中的FieldId有一位是排序标志位
  • None unique index's EntityID表示非惟一索引指向的目标,惟一索引存在于Value内

2.2 Value存储编码:

  与TableCF的Value编码相同。

2.3 dbscan工具输出示例:

二、索引管理:

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

三、索引扫描:

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

public async Task<object> IndexScan()
{
//新建索引扫描,范型参数1为实体类型,参数2为索引类型
var q = new IndexScan<Entities.VehicleState, Entities.VehicleState.IX_VID_Speed>();
//如果是分区表可通过分区谓词指定分区扫描,非分区表无效
q.Partitions.Equal(t => t.VID, 3);
//可指定索引谓词确定扫描范围
q.Keys.Equal(t => t.VID, 3);
//如果是复合索引可指定其他索引谓词
q.Keys.Equal(t => t.Speed, 100);
return await q.Take(10).ToListAsync();
}
  • 索引谓词目前仅实现了相等性判断,其他如大于、小于等稍后实现
  • 索引扫描的附加过滤条件尚未实现

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

public async Task<object> FillData()
{
//第一个参数128表示并行任务数,第二个参数表示每个任务执行次数
//作者虚拟机(I74C8G)执行以下代码约每秒插入13000条记录
return await SimplePerfTest.Run(128, 500, async (i, j) =>
{
var obj = new Entities.VehicleState(i);
obj.Speed = j;
await EntityStore.SaveAsync(obj);
});
}

四、本篇小结:

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

AppBoxFuture: 二级索引及索引扫描查询数据的更多相关文章

  1. sql查询未走索引问题分析之查询数据量过大

    前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉 ...

  2. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  3. HBase高性能复杂条件查询引擎---二级多列索引

    http://www.infoq.com/cn/articles/hbase-second-index-engine 原理 “二级多列索引”是针对目标记录的某个或某些列建立的“键-值”数据,以列的值为 ...

  4. [20180408]那些函数索引适合字段的查询.txt

    [20180408]那些函数索引适合字段的查询.txt --//一般不主张建立函数索引,往往是开发的无知,使用trunc等函数,实际上一些函数也可以用于字段的查询.--//以前零碎的写过一些,放假看了 ...

  5. mysql索引优化比普通查询速度快多少

    mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...

  6. 在MySQL中如何使用覆盖索引优化limit分页查询

    背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...

  7. Mysql 索引原理《一》索引原理与慢查询1

    为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然 ...

  8. Mysql 索引原理《一》索引原理与慢查询2

    一 索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题 1 范围问题,或者说条件不明确,条件中出现这些符号或关键字:& ...

  9. MySQL索引原理与慢查询

    =========索引原理与慢查询======= 阅读目录 -     一.介绍 -     二.索引的原理 -     三.索引的数据结构 -     四.聚集索引与辅助索引 -     五.MyS ...

随机推荐

  1. c# 查询本机可用的代理ip

    现在有很多网站都提供免费的代理ip,但是你会发现很多网站显示的可以用的 ,在自己电脑上是用不了,写个小代码提取出自己电脑上可以用的代理,没什么技术含量,只是为了记录一下 string strUrl = ...

  2. Qt设置窗体的透明度: setWindowOpacity

    在Qt中,设置窗体透明度的函数有:void   setWindowOpacity(qreal level)   特性: 透明度的有效范围从1.0(完全不透明)到0.0(完全透明的). 默认情况下,此属 ...

  3. 安装Cloudera Impala

    安装Cloudera Impala Cloudera Impala是Cloudera Enterprise Core的开源扩展,用于快速返回查询结果. Impala作为你环境的插件,与其他组件的安装独 ...

  4. OVS实现VXLAN隔离

    一.实验环境 1.准备3个CentOS7 mini版本的虚拟机,每个主机3个网卡.如图: 图中OVS-1.OVS-2.OVS-3分别为三台CentOS7 mini版虚拟机,分别配备3个虚拟网卡.如图中 ...

  5. 项目总结之echarts 使用

    项目上需要使用echarts,对于一个新手前端来说,差点要爆炸了,自身前端基础就不好,echarts就更是不熟了,硬生生的逼着要一周做完一个系统.这算是个小总结吧,以后万一用的上捏. 渐变使用 项目中 ...

  6. 关于java中构造方法、实例初始化、静态初始化执行顺序

    在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...

  7. spring boot使用log4j2将日志写入mysql数据库

    log4j2官方例子在spring boot中报错而且还是用的是org.apache.commons.dbcp包 我给改了一下使用org.apache.commons.dbcp2包 1.log4j2. ...

  8. Python编程菜鸟成长记--A1--02--Python介绍

    目录 1.重点知识 2.Python 语言介绍 2.1.Python 在主要领域的应用前景 2.2.Python 在机构.行业巨头公司的应用 3.Python 的发展史 4.Python 的发展前景如 ...

  9. ZOJ 3981:Balloon Robot(思维+递推)

    题目链接 题意 有n支队在m个位置上做题,有一个机器人位置1到位置m再到位置1循环走派发气球,当队伍a在时间b做完了一道题目的时候,假如机器人走到队伍a的位置的时间为c,那么这个队伍的不开心值就是c- ...

  10. Altium Designer设计PCB--如何增大电源地的线宽

    笑话: 看见楼下老大爷在下棋,我看了一会儿,跟大爷说:大爷,你che没了. 大爷一脸不屑:小朋友,那叫ju. 然后我静静地在那看了两个小时. 对完棋,大爷起身要走. 我说:大爷,我刚才说的不是你的棋, ...