InfluxDB SHOW SERIES语句按照什么顺序返回?

在这里插入图片描述本作品采用知识共享署名-非商业性使用-相同方式共享 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_id2=Mqw0vQ\\=\\="
"yottadb_partition_replicas_num_lzl_ywq,account_id4=Mqw0vQ\\=\\="
"yottadb_partition_replicas_num_lzl_ywq,account_id5=Mqw0vQ\\=\\="
"yottadb_partition_replicas_num_lzl_ywq,account_id7=Mqw0vQ\\=\\="
"yottadb_partition_replicas_num_lzl_ywq,account_id8=Mqw0vQ\\=\\="
"yottadb_partition_replicas_num_lzl_ywq,account_id9=Mqw0vQ\\=\\="
account_id2account_id4account_id5account_id7account_id8account_id9
Mqw0vQ\=\=nullnullnullnullnull
nullMqw0vQ\=\=nullnullnullnull
nullnullMqw0vQ\=\=nullnullnull
nullnullnullMqw0vQ\=\=nullnull
nullnullnullnullMqw0vQ\=\=null
nullnullnullnullnullMqw0vQ\=\=

这个case表示不是以serieskey内部的tag本身做排序;因为以这个规则排序展开后account_id9应该排在最前面,因为null本身小于任何值。

"car1,city=city_0dddd,id=2,type=type_2"
"car1,city=city_0dddd\\ ,id=2,type=type_2"
"car1,city=city_1,id=3,type=type_0"

空格的ascall码小于 ‘,’ ,所以也不是以serieskey排序

SHOW SERIES比较原理

我们回到show series,引擎内部迭代器调用栈帧如下:

  1. v1/coordinator/statement_executor.go:createIteratorsV2
  2. influxql/query/select.go:Select
  3. influxql/query/compile.go: (c *compiledStatement) Prepare 已经把shards赋值给preparedStatement.ic
  4. influxql/query/select.go: (p *preparedStatement) Select
  5. influxql/query/select.go:buildCursor
  6. influxql/query/select.go:buildAuxIterator
  7. tsdb/shard.go:(a Shards) CreateIterator
  8. tsdb/shard.go:(s *Shard) CreateIterator
  9. tsdb/engine/tsm1/engine.go:CreateIterator
  10. tsdb/shard.go:(a Shards) CreateIterator
  11. tsdb/shard.go:(a Shards) createSeriesIterator
  12. tsdb/index.go:NewSeriesPointIterator
  13. tsdb/index.go:MeasurementIterator (is IndexSet) measurementIterator()
  14. tsdb/index/tsi1/index.go: (i *Index) MeasurementIterator()
  15. tsdb/index/tsi1/partition.go (p *Partition) MeasurementIterator()
  16. tsdb/index/tsi1/file_set.go (fs *FileSet) MeasurementIterator()
  17. 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返回的真正顺序遵循以下规则:

  1. 以measurement name排序
  2. 每个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为顺序,最后发现与想的完全不同。

以后做任何事前都需要提醒自己,合理的规划可以节省大量时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式 Linux 开发的基本概念 及 学习路线

原文链接:https://www.cnblogs.com/DSCC2020/p/13787321.html 1.嵌入式 Linux 开发的基本概念 1.1嵌入式 Linux 的组成 嵌入式 Linux 系统,就相当于一套完整的 PC 软件系统,如下图所示: 1.2嵌入式 Linux 的日常开发流程 Bootloa…

IDEA稀奇古怪问题的解决方案

idea在电脑死机重启后,启动项目报错 尝试了各种办法,重新导入项目,删除.idea文件重新导入,把本地代码删除重新pull下来再次导入,均无法解决。而且代码在eclipse中可以正常启动,遂排除代码和网络环境原因。…

探索c++——了解c++的魅力

前言:c是一门既面向对象又面向过程的语言。 不同于java纯粹的面向对象和c纯粹的面向过程。 造成c该特性的原因是c是由本贾尼大佬在c的基础上增添语法创建出来的一门新的语言。 它既兼容了c, 身具面向过程的特性。 又有本身的面向对象的特性。 面向对象和…

软考高级:UML 图 结构图、行为图和交互图 概念和题目

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Vue3+Vue Router使用<transition>过渡动画实现左右分栏后台布局

摘要 利用Vue3及其配套的Vue Router实现后台管理系统中的页面过渡动画。文章首先简要介绍了Vue3的特性和Vue Router的基本用法,利用Vue3提供的组件以及Vue Router的路由钩子函数来实现页面过渡效果。 代码结构 在 components 里有4个组件,其中 Layout…

笔记本上使用usb蓝牙适配器

注意 必须先禁用笔记本上原来的蓝牙功能 禁用笔记本原来的蓝牙功能 使用usb蓝牙适配器

LVS集群---二

1.LVS工作模式和相关命令 1.1LVS集群工作模式 - lvs-nat:修改请求报文的目标IP,多目标IP的DNAT- lvs-dr:操纵封装新的MAC地址(直接路由)- lvs-tun:隧道模式 1.1.1 LVS的NAT模式 lvs-nat:本质是多目标IP的…

openssl3.2 - exp - 产生随机数

文章目录 openssl3.2 - exp - 产生随机数概述笔记END openssl3.2 - exp - 产生随机数 概述 要用到openssl产生的随机数, 查了资料. 如果用命令行产生随机数, 如下: openssl rand -hex -num 6 48bfd3a64f54单步跟进去, 看到主要就是调用了一个RAND_bytes(), 没其他了. 官方说…

人工智能在信息系统安全中的运用

一、 概述 对于企业和消费者来讲,人工智能是非常有用的工具,那又该如何使用人工智能技术来保护敏感信息?通过快速处理数据并预测分析,AI可以完成从自动化系统到保护信息的所有工作。尽管有些黑客利用技术手段来达到自己的目的,但…

华为数通方向HCIP-DataCom H12-821题库(多选题:101-120)

第101题 下面关于Network-Summary-LSA描述正确的是 A、Network-Summary-LSA中的Metric被设置成从该ABR到达目的网段的开销值 B、Network-Summary-LSA中 的Netmask被设置成目的网段的网络掩码 C、Network-Summary-LSA中的Link State ID被设置成目的网络的IP地址 D、Network-Sum…

【AI视野·今日Robot 机器人论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 6 Mar 2024 Totally 30 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚SpaceHopper,外星探索多功能三足机器人 (from Robotic Systems Lab, ETH Zurich) Daily Robotics Papers A Safety-Criti…

JavaSE——基础小项目-模拟ATM系统(项目主要目标、技术选型、架构搭建、具体实现、完整代码注释)

目录 项目主要目标 技术选型 面向对象编程 使用集合容器 程序流程控制 使用常见API 系统架构搭建与欢迎页设计 Account ATM Test 用户开户功能实现 录入账户名称与性别 录入账户密码与取现额度 生成新卡号 存入账户 登录功能实现 登录后操作实现 退出账户 存…

每日学习总结20240306

每日总结 20240306 1. 断言测试判断 #include <iostream> #include <assert.h> #include <cassert> #include <stdio.h>#define STR_OK "[\x1b[1;32m OK \x1b[0m]" #define STR_FAIL "[\x1b[1;31mFAIL\x1b[0m]"…

Open3D 生成空间3D椭圆点云

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 设椭圆在 X O Y XOY XO

vue3+ts项目创建 使用npm create vue@latest

npm create vuelatest相关创建代码&#xff1a;

短视频矩阵系统技术开发商--支持技术资质核验(自研独立saas框架开发)

短视频矩阵系统是一种能够帮助用户快速制作、发布和推广短视频的系统。 &#x1f347;&#x1f347;它通常包括以下部分&#xff1a; 短视频矩阵系统#短视频矩阵系统源头#短视频矩阵系统源头开发#短视频矩阵系统软件#短视频矩阵系统技术#2024互联网风口项目短视频矩阵系统带动…

【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 6 Mar 2024 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MAGID: An Automated Pipeline for Generating Synthetic Multi-modal Datasets Authors Hossein Aboutalebi, …

贪心 Leetcode 968 监控二叉树

监控二叉树 Leetcode 968 学习记录自代码随想录 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 要点&#xff1a;1.想到优先覆盖叶子节点&#xff0c…

css-通用样式按钮加号

1.实现 2.代码 html <div class"addF">&#xff0b;</div> css .addF{width:40px;font-size:25px;font-weight:600;background-color:rgb(64, 158, 255);text-align:center;color:white;height:34px;border-radius:3px;line-height:34px; }

【漏洞复现】-用友CRM系统存在逻辑漏洞直接登录后台

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;…