浅谈时序数据库TDengine
最近TDengine很火,本人也一直很早就有关注,其官方给出的测试性能结果很喜人,所以一开源,本人就进行了相关调研,最终发现还是存在着一定的问题,期待后续的完善吧
写入问题
必须为每个Tag组合起一个表名
付出的代价:
用户必须要保证每个Tag组合起的表名唯一,并且一旦Tag组合数过多用户很难记住每个Tag组合对应的表名,在查询时基本都是靠超级表STable来查询。所以对用户来说这个表名几乎没用到却让用户来花代价来起名
这样设计的最终目的是为了将相同Tag组合的数据放到一起,但是系统设计时完全可以自己内部针对这个Tag组合记录一个唯一id或者唯一字符串来作为内部隐藏的表名,来替换让用户自己起表名的操作,对用户只需要呈现一个超级表STable即可,减轻用户负担。
其实可以看到上述其实是将系统内部判断唯一的负担转交给用户,麻烦了用户。假如系统内部自动判断Tag组合是否唯一,则在数据写入过程中一直需要判断当前Tag组合是否存在以及查找对应的底层唯一id或者唯一字符串,而让用户起表名则省去了上述代价,因为用户起的表名就是一个唯一的字符串,所以写入性能自然好一些
Tag支撑与管理
最多支持6个Tag,如果想要支持更多就要重新源码编译
超级表STable对Tag组合的索引是全内存的,终将会遇到瓶颈的,InfluxDB已经走过这条路了,从之前的全内存到后面的tsi
超级表STable对Tag组合的索引仅仅是对第一个Tag作为key来构建一个skiplist,也就是说当你的查询用到第一个tag时可以利用下上述索引,当你的查询没用到第一个tag时,那就是暴力全