- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
**摘要:**GaussDB(for Influx)通过提供hint功能,在单时间线的查询场景下,性能有大幅度的提升,能有效满足客户某些特定场景的查询需求。
本文分享自华为云社区《华为云GaussDB(for Influx)揭秘第十期:最佳实践之hint查询》,作者:高斯Influx官方博客。
“怎么感觉查询越来越慢了?”随着业务数据量的不断增大,很多客户都反馈同样的查询语句变得越来越慢。接到客户的反馈后,我们分析了客户的查询执行各个阶段的耗时,发现随着数据量的增加,耗在倒排索引阶段的时间越来越长,那么倒排索引到底是干什么用的呢?能不能跳过倒排索引呢?
倒排索引,顾名思义,是一种索引结构,该索引避免了多维查询时进行大量的数据扫描。其本身就是用于提高查询性能的,显然不能简单地跳过倒排索引。但是随着数据量的不断增大,确实引起了查询的时延变大。那么倒排索引的原理是什么?适合于哪种业务场景?有没有可能跳过倒排索引,来进一步降低查询时延呢?本文基于GaussDB(for Influx)的实现,给您一一解答上述问题。
用以下数据作为示例进行说明,其中
Tag:region,service,host;
Field:cpu,mem;
数据源(SeriesKey):region+service+host;
1)要查询某个数据源在某个时间点的cpu使用情况,例如:
select max(cpu) from mst where region=’北京’ and service=’influx’ and host=’host001’ and time>now()-30s
所有的tag都指定了相应的值。
2)给定部分维度,查询某些信息:例如要查询北京(region)的Influx(service)服务的cpu使用情况:
select max(cpu) from mst where region=’北京’ and service=’influx’ and time>now()-30s
只指定了部分tag值。
对于第一种查询方案,可以直接根据tag值来确定数据源,但是对于第二种场景,查询没有直接给出具体的数据源,仅指定了两个维度(region和service)以及查询的指标cpu,这种查询就需要根据部分维度组合(region=北京,service=influx)找到所有对应的数据源,例如在数据中北京的Influx服务有3台主机(host001, host002, host003),就需要查找到这3台主机数据源,这就需要倒排索引,否则就需要进行大量的数据扫描。
有了倒排索引,Influx的查询能力得到了很大的提升,但是随着数据量的不断增长,消耗在倒排索引的时间也越来越长;倒排索引的作用就是通过部分维度来找到对应所有的数据源,那么如果我们可以通过其他方式更快地找到数据源,就可以跳过倒排索引了。数据源是由tag set的value组成的,即由region,service,host三个tag的值组成,例如region=“北京”,service=“influx”,host=“host001”三个tag值就组成一个数据源。那么当业务要查询的查询里带了所有tag的值时,我们就可以根据查询语句来确定数据源,例如:
select max(cpu) from mst where region=’北京’ and service=’influx’ and host=’host001’ and time>now()-30s
该语句查询过去30s内北京region,Influx服务,host001主机的CPU的最大值。上面的查询带了需要确定数据源的所有tag的值,因此我们在这种查询中就可以跳过倒排索引的阶段,类似的查询我们也叫做单时间线查询。
上一章节讲到,如果业务的查询是单时间线查询,我们就可以根据查询语句来确认数据源,而不用再去倒排索引中找。基于这个思路,GaussDB(for Influx)实现了hint特性,hint特性允许客户指定查询跳过倒排索引模块,直接去查找数据,从而进一步提高查询性能。
GaussDB(for Influx)通过定义特殊的hint语法来识别查询语句是否走倒排索引,系统解析业务查询语句时,如果识别到查询带有hint语法,就会跳过倒排索引查找的步骤,直接根据查询语句中tagset信息,找到数据源,去存储层查找对应的数据,其逻辑对比如下图:
针对单时间线查询的场景下,我们测试了使用hint功能和不适用hint功能之间的性能。
测试条件为:300万时间线,单时间线查询;执行查询1000次取平均时延。下图为hint查询和非hint查询的测试结果对比:
从图中可以看出,在相同的查询语句和测试环境下,hint查询时延明显优于非hint查询。
使用hint查询的方法也很简单,业务只需要少量的改动即可,在查询时添加hint查询标识/*+ full_series */。例如,常规查询语句为:
select max(cpu) from mst where region=’北京’ and service=’influx’ and host=’host001’ and time>now()-30s
改为用hint的方式,查询语句为:
select /*+ full_series */ max(cpu) from mst where region=’北京’ and service=’influx’ and host=’host001’ and time>now()-30s
在使用hint方式查询时,一定要确定是单时间线的查询,否则可能会出现查不出来数据的问题。
GaussDB(for Influx)通过提供hint功能,在单时间线的查询场景下,性能有大幅度的提升,能有效满足客户某些特定场景的查询需求。
除了以上优势外,GaussDB(for Influx)还在集群化、冷热分级存储、高可用方面也做了深度优化,能更好地满足时序应用的各种场景。
本文作者:华为 云数据库创新Lab & 华为云时空数据库团队
更多技术文章,关注GaussDB(for Influx)官方博客:
高斯Influx官方博客的博客_云社区-华为云
Lab官网:云数据库创新Lab-主页-华为云
产品首页:时序数据库_GaussDB for Influx_数据库-华为云
华为伙伴暨开发者大会2022火热来袭,重磅内容不容错过!
【精彩活动】
勇往直前·做全能开发者→12场技术直播前瞻,8大技术宝典高能输出,还有代码密室、知识竞赛等多轮神秘任务等你来挑战。即刻闯关,开启终极大奖!点击踏上全能开发者晋级之路吧!
【技术专题】
未来已来,2022技术探秘→华为各领域的前沿技术、重磅开源项目、创新的应用实践,站在智能世界的入口,探索未来如何照进现实,干货满满点击了解
考虑以下因素: let container = document.getElementById('container'); let inp = container.querySelector('#my
假设我们有一些函数 func映射类 A 的实例类的实例 B ,即它有签名 Callable[[A], B] . 我想写一个类装饰器autofunc对于 A 的子类自动应用 func在创建实例时。例如,
我有一个类通过预定的执行程序来安排任务。 我希望在 TimeUnit 上对类进行参数化。我的意思是我希望能够为线程池构造具有延迟等的类,以及一种指定 TimeUnit 的方法,例如如果是秒/毫秒/分钟
关于 cppreference关于map::emplace_hint() : template iterator emplace_hint( const_iterator hint, Args&&.
我在我的 html 中添加了一个 mat-hint 元素。我只想在用户关注相应的表单字段时显示 mat-hint 并隐藏 focusout 上的提示。如何为所有表单字段实现此方案。 Max 5
虽然以下代码确实使用鼠标所在单元格的文本正确设置了 Form1.Caption,但它不会显示任何 DBGrid.Hint 除非我单击该单元格。 这张图有什么问题吗? type THackGrid =
我是 ORM 解决方案的倡导者,并且不时举办关于 Hibernate 的研讨会。 在谈论框架生成的 SQL 时,人们通常会开始谈论他们需要如何使用“提示”,而这在 ORM 框架中被认为是不可能的。 通
我有以下设置:我正在使用 PHPUnit 模拟非抽象类,但不是它的所有方法。因此,非模拟方法仍然作为对模拟中真实方法的调用而存在。 问题是:如何暗示这些方法可用(当然,具有正确的签名)? 我会详细说明
嗨,谁能帮助我了解如何在 mongo 聚合查询中使用“提示”,现在我正在使用下面的代码来查询结果。 AggregationOptions options = AggregationOptions.bu
我有一个简单的拼字游戏。我已经搞砸了,但现在我想添加一个“提示”系统。我不知道如何显示元组中的 1 个项目。我有 2 个元组,我想根据第一个元组是什么从第二个元组中提取。我有一个 WORD=("x",
如何在 Hint.css 中应用手动换行符提示? 我几乎尝试了一切:, \n,以及它们的组合。 我也在 CSS 中尝试了一些东西: white-space: normal; word-wrap: br
我正在尝试使用 hint.css在我的注册表中,但它不起作用,工具提示与其他标签一起工作正常,但不适用于 标签这是我的 html 部分: Hello 演示 here 或者请建议任何支持输入标签
我正在使用 HINT.css对于工具提示,我不能为了上帝的爱得到工具提示来扩展内容。我试过清除固定,设置高度等等,但无济于事。基本上我想说: &:after content: attr
在PyCharm Code completion > "Basic Completion"> "Invoke Basic Completion"> "Dictionaries"我看到,如果您将字典硬编
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to change the filename displayed in the “Save as…”
这个问题在这里已经有了答案: How to make an Android Spinner with initial text "Select One"? (36 个答案) 关闭 6 年前。 数据库
在 Live Photos 部分下的 iOS 人机界面指南中,Apple 是这样说的, "Make sure that users can distinguish a Live Photo from
在进行套接字编程时,人们总是这样命名 addrinfo 结构: struct addrinfo hints; // get ready to connect status = getaddrinfo(
Python 想必大家都已经很熟悉了,甚至关于它有用或者无用的论点大家可能也已经看腻了。但是无论如何,它作为一个广受关注的语言还是有它独到之处的,今天我们就再展开聊聊 Python。 Python
概述 从PHP5开始,我们可以使用类型提示来指定定义函数时,函数接收的参数类型。如果在定义函数时,指定了参数的类型,那么当我们调用函数时,如果实参的类型与指定的类型不符,那么PHP会产生一个致命级
我是一名优秀的程序员,十分优秀!