网站搜索引擎优化情况怎么写,青海省建设工程监理协会网站,wordpress搜索关闭,设计网站推荐提升审美本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
本作品 (李兆龙 博文, 由 李兆龙 创作)#xff0c;由 李兆龙 确认#xff0c;转载请注明版权。 文章目录 引言样例SHOW SERIES比较原理结论结束语 引言
influxdb的计算引擎为了做到自底而上的…本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
本作品 (李兆龙 博文, 由 李兆龙 创作)由 李兆龙 确认转载请注明版权。 文章目录 引言样例SHOW SERIES比较原理结论结束语 引言
influxdb的计算引擎为了做到自底而上的合并逻辑必然存在某种row的排序规则这些规则在查询计划的创建阶段就已经确定。
比如group by tags此类查询基于tag的排序而group by time的查询则基于time去做排序group by tags, time 则是基于tags和time至于show则是基于field排序特殊的比如show series cardinality在改写为select后实际是基于tags排序
事实上要完成一个流式引擎必须自底而上遵循某种排序规则例如子查询内部的排序规则和内部排序规则不同是则需要重排这就没法做到流式返回。
样例
show series不是基于serieskey或者基于展开后的tag做排序简单的看两个show series 返回的case
yottadb_partition_replicas_num_lzl_ywq,account_id2Mqw0vQ\\\\
yottadb_partition_replicas_num_lzl_ywq,account_id4Mqw0vQ\\\\
yottadb_partition_replicas_num_lzl_ywq,account_id5Mqw0vQ\\\\
yottadb_partition_replicas_num_lzl_ywq,account_id7Mqw0vQ\\\\
yottadb_partition_replicas_num_lzl_ywq,account_id8Mqw0vQ\\\\
yottadb_partition_replicas_num_lzl_ywq,account_id9Mqw0vQ\\\\account_id2account_id4account_id5account_id7account_id8account_id9Mqw0vQ\\nullnullnullnullnullnullMqw0vQ\\nullnullnullnullnullnullMqw0vQ\\nullnullnullnullnullnullMqw0vQ\\nullnullnullnullnullnullMqw0vQ\\nullnullnullnullnullnullMqw0vQ\\
这个case表示不是以serieskey内部的tag本身做排序因为以这个规则排序展开后account_id9应该排在最前面因为null本身小于任何值。
car1,citycity_0dddd,id2,typetype_2
car1,citycity_0dddd\\ ,id2,typetype_2
car1,citycity_1,id3,typetype_0空格的ascall码小于 ‘,’ 所以也不是以serieskey排序
SHOW SERIES比较原理
我们回到show series引擎内部迭代器调用栈帧如下
v1/coordinator/statement_executor.go:createIteratorsV2influxql/query/select.go:Selectinfluxql/query/compile.go: (c *compiledStatement) Prepare 已经把shards赋值给preparedStatement.icinfluxql/query/select.go: (p *preparedStatement) Selectinfluxql/query/select.go:buildCursorinfluxql/query/select.go:buildAuxIteratortsdb/shard.go:(a Shards) CreateIteratortsdb/shard.go:(s *Shard) CreateIteratortsdb/engine/tsm1/engine.go:CreateIteratortsdb/shard.go:(a Shards) CreateIteratortsdb/shard.go:(a Shards) createSeriesIteratortsdb/index.go:NewSeriesPointIteratortsdb/index.go:MeasurementIterator (is IndexSet) measurementIterator()tsdb/index/tsi1/index.go: (i *Index) MeasurementIterator()tsdb/index/tsi1/partition.go (p *Partition) MeasurementIterator()tsdb/index/tsi1/file_set.go (fs *FileSet) MeasurementIterator()tsdb/index/tsi1/log_file.go (f *LogFile) MeasurementIterator()
事实上createSeriesIterator之下的MeasurementIterator都是基于measurement name做比较真正的比较是shards中的seriesPointIterator其首先会获取每一个measurement的全部时间序列对应的tsid随后从sfile中获取tsid对应的serieskey直接原地调用sort 排序seriesKeys实际调用CompareSeriesKeys作为比较函数。
核心比较函数为CompareSeriesKeys
func CompareSeriesKeys(a, b []byte) int {// Handle nil keys.if len(a) 0 len(b) 0 {return 0} else if len(a) 0 {return -1} else if len(b) 0 {return 1}// Read total size._, a ReadSeriesKeyLen(a)_, b ReadSeriesKeyLen(b)// Read names.name0, a : ReadSeriesKeyMeasurement(a)name1, b : ReadSeriesKeyMeasurement(b)// Compare names, return if not equal.if cmp : bytes.Compare(name0, name1); cmp ! 0 {return cmp}// Read tag counts.tagN0, a : ReadSeriesKeyTagN(a)tagN1, b : ReadSeriesKeyTagN(b)// Compare each tag in order.for i : 0; ; i {// Check for EOF.if i tagN0 i tagN1 {return 0} else if i tagN0 {return -1} else if i tagN1 {return 1}// Read keys.var key0, key1, value0, value1 []bytekey0, value0, a ReadSeriesKeyTag(a)key1, value1, b ReadSeriesKeyTag(b)// Compare keys values.if cmp : bytes.Compare(key0, key1); cmp ! 0 {return cmp} else if cmp : bytes.Compare(value0, value1); cmp ! 0 {return cmp}}
}结论
所以事实上show series返回的真正顺序遵循以下规则
以measurement name排序每个measuremnet基于serieskey内部的tag本身做排序
其实很好理解因为从tsi中获取measurement对应的tsid后又从sfile获取对应的serieskey此时的serieskey为了解析的性能事实上进行了二进制编码的无法直接拿来比较其次此时是没有schema的概念的所以如果基于tag去排序效率会及其低下因为需要先计算合并后的schema结构然后再生成新的row所以搞了个这么个性能不错但是奇奇怪怪的排序方法
这种比较方式可以应用到流式框架但是意义不大因为本身这种排序就没有规定一个全局顺序不同的tagkey都直接拿来比较了而且与influxql本来的排序方式差别很大额外的开发工作很多
从用户的角度看show series的顺序没有什么意义就算希望有意义当前的show series也无法满足所以最好的方式就是直接hash merge不给用户保证show series的返回顺序influxdb的官网也没有保证show series的顺序。
结束语
花了三十分钟迅速写完这篇文章倒不是这个点很重要关键在于我在半年前实现某些特性时假设其顺序是serieskey在第二次实现假设其是以tag为顺序最后发现与想的完全不同。
以后做任何事前都需要提醒自己合理的规划可以节省大量时间。