这次讲一个索引设计的例子,数据具有时序特征,比如,监控数据、股票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就可以搞定了。