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 ...
随机推荐
- 梅林路由器 开启ssh key远程登录
转载自 开启SSH KEY在手机远程登陆路由 http://koolshare.cn/thread-67565-1-1.html (出处: KoolShare) 首先修改路由的登录名和密码 下载put ...
- Android开发环境搭建(原创)
1,我的环境: win8 64位 2,软件安装: 1) jdk-7u40-windows-i586.exe 下载合适的版本,我下载的是 jdk7u40 32位 for windows 安装JDK,配置 ...
- 转:Mongoose使用操作
一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据库的接口. 连接数据库 // mongoose 链接var mongoose = req ...
- __file__、__name__、__dict__方法整理
本文主要介绍__file__.__name__.__dict__三个方法的作用. #01 __file__:打印当前文件的位置. # import os # print(__file__) # 在py ...
- SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)
前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...
- 《深入理解ES6》读书笔记
文章目录 第一章 块级绑定 1. var 声明与变量提升 2. let 与 var 的区别 第二章 字符串与正则表达式 1.字符串扩展 1.1 includes().startsWith() .end ...
- Idea中maven项目中导入本地jar包
说一下正确的流程: 1.将jar包导入到本地maven库或者远程nexus仓库,再使用maven引用: 2.导入命令: //通过一下信息引入maven -DgroupId=com.test -Dart ...
- 【python】UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
header中干掉 "Accept-Encoding": "gzip, deflate, br", 注意:
- 小白开学Asp.Net Core 《六》
小白开学Asp.Net Core <六> —— 探究.Net Core 跨平台的奥秘 1.写这篇文章的初衷 有好多朋友反馈看不懂我写的开源的一个练手项目(GitHub:https://gi ...
- UESTC 1324:卿学姐与公主(分块)
http://acm.uestc.edu.cn/#/problem/show/1324 题意:…… 思路:卿学姐的学习分块例题. 分块是在线处理区间问题的类暴力算法,复杂度O(n*sqrt(n)),把 ...