时序索引
这次讲一个索引设计的例子,数据具有时序特征,比如,监控数据、股票k线数据等等。
如果时序数据同时还具备多维度,那就需要druid、clickhouse来完成。
像股票k线这样的数据,就没有太多的维度,按照股票的ID和K线的类型进行过滤即可。
下面介绍一个股票K线数据索引的设计思路。
时间戳
要做时序数据首先要定义时间字段,最简单的unixtime,精度到秒,比如1583769600。
用4字节的int来存储unixtime,现在是可以存下的,未来还可以使用十几年,如果还不放心,
可以考虑用无符号整形,足够用到退休了。
k线的类型
股票的K线主要是按照时间区分的,1min、3min、5min….一共十几种,1个字节就够了。
股票的ID
short对应的是两个字节的整形,最大可以到32768,无符号可以到65536。
国内的A股也就四五千只股票的规模,考虑到可能退市等因素,2个字节也足够了。
合并
为这三个字段建联合唯一索引,肯定是可以满足需求的,但是这样很铺张浪费。
我的目标是用一个long型字段,来满足需求。long是8个字节,三个字段加起来是7个字节,
还可以留下一个byte作为扩展。
((long) this.symbolId << 40) | ((long) this.type.value << 32) | (long) this.timeSeq
合并成一个long型的字段,可以节省索引空间,高效的使用btree来处理Between,使用bitmap优化也没问题。
Query
在检索的时候,股票ID是确定的,k线类型也是确定的,时间是一个范围查询。
将时间范围的起点和终点,通过上面的合并方法进行处理,可以得到两个long值,
Between就可以搞定了。