AppBoxFuture: 二级索引及索引扫描查询数据
数据库索引对于数据查询的重要性不可言喻,因此作者在存储层实现了二级索引,以及利用索引进行扫描的功能。目前仅实现了分区表与非分区表的本地索引(数据与索引共用一个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: 二级索引及索引扫描查询数据的更多相关文章
- sql查询未走索引问题分析之查询数据量过大
前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉 ...
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- HBase高性能复杂条件查询引擎---二级多列索引
http://www.infoq.com/cn/articles/hbase-second-index-engine 原理 “二级多列索引”是针对目标记录的某个或某些列建立的“键-值”数据,以列的值为 ...
- [20180408]那些函数索引适合字段的查询.txt
[20180408]那些函数索引适合字段的查询.txt --//一般不主张建立函数索引,往往是开发的无知,使用trunc等函数,实际上一些函数也可以用于字段的查询.--//以前零碎的写过一些,放假看了 ...
- mysql索引优化比普通查询速度快多少
mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...
- 在MySQL中如何使用覆盖索引优化limit分页查询
背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...
- Mysql 索引原理《一》索引原理与慢查询1
为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然 ...
- Mysql 索引原理《一》索引原理与慢查询2
一 索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题 1 范围问题,或者说条件不明确,条件中出现这些符号或关键字:& ...
- MySQL索引原理与慢查询
=========索引原理与慢查询======= 阅读目录 - 一.介绍 - 二.索引的原理 - 三.索引的数据结构 - 四.聚集索引与辅助索引 - 五.MyS ...
随机推荐
- MeeGo 设备运行全部 Android 应用程序?
啥是 OpenMobile ACL?它是一个应用程序兼容层(Application Compatibility Layer),能让 MeeGo 设备运行全部 Android 应用程序. 据 ACL 宣 ...
- D7下FastMM的使用
原文出处:http://hi.baidu.com/showwindows/blog/item/5b7ac601c487c605728da573.html FastMM 快速MM:-),在D2006和2 ...
- 给你的 GitHub Repository 加上 sponsor 按钮
「本文微信公众号 AndroidTraveler 首发」 背景 其实之前 GitHub 就已经说过要给开源的开发者提供赞助支持. 当你进入 GitHub 主页时,你会在右边发现一个 Tips. 点击进 ...
- ES 21 - Elasticsearch的高级检索语法 (包括term、prefix、wildcard、fuzzy、boost等)
目录 1 term query - 索引词检索 1.1 term query - 不分词检索 1.2 terms query - in检索 2 prefix query - 前缀检索 3 wildca ...
- Scala 学习之路(十)—— 函数 & 闭包 & 柯里化
一.函数 1.1 函数与方法 Scala中函数与方法的区别非常小,如果函数作为某个对象的成员,这样的函数被称为方法,否则就是一个正常的函数. // 定义方法 def multi1(x:Int) = { ...
- 【设计模式】结构型01代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 定义:顾名思义,增加中间层,为其他对象提供一种代理以控制对这个对象的访问.核心在于代理二字. 1.和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理 ...
- PATB 1038. 统计同成绩学生(20)
https://www.patest.cn/contests/pat-b-practise/1038 #include <cstdio> int cnt[110]; int temp[10 ...
- oh-my-zsh自定义配置
oh-my-zsh主题配置 默认的zsh主题robbyrussell已经很棒了, 简洁高效, 能很好的显示git的相关信息, 比如branch信息, 修改, 删除, 添加等操作. 但是多用户的话就不能 ...
- 喵星人教你 HTTP 状态码
在我们日常 Web 开发中,或多或少的都接触过 HTTP 状态码,那这些状态码代表什么意思呢?熟悉这些状态码又有什么好处呢?下面我就为大家一一道来,可以把本片文章'收藏'以备不时之需. HTTP 状态 ...
- bugku welcome to bugkuctf
题目地址:http://123.206.87.240:8006/test1/ 这道题主要用到了俩个知识点:php伪协议和序列化 点进题目看到:you are not the number of bug ...