写点什么

揭秘华为云 GaussDB(for Influx) 最佳实践:hint 查询

  • 2022 年 5 月 30 日
  • 本文字数:2235 字

    阅读完需:约 7 分钟

本文分享自华为云社区《华为云GaussDB(for Influx)揭秘第十期:最佳实践之hint查询》,作者:高斯 Influx 官方博客。

 

“怎么感觉查询越来越慢了?”随着业务数据量的不断增大,很多客户都反馈同样的查询语句变得越来越慢。接到客户的反馈后,我们分析了客户的查询执行各个阶段的耗时,发现随着数据量的增加,耗在倒排索引阶段的时间越来越长,那么倒排索引到底是干什么用的呢?能不能跳过倒排索引呢?

 

倒排索引,顾名思义,是一种索引结构,该索引避免了多维查询时进行大量的数据扫描。其本身就是用于提高查询性能的,显然不能简单地跳过倒排索引。但是随着数据量的不断增大,确实引起了查询的时延变大。那么倒排索引的原理是什么?适合于哪种业务场景?有没有可能跳过倒排索引,来进一步降低查询时延呢?本文基于 GaussDB(for Influx)的实现,给您一一解答上述问题。

1. 为什么要使用倒排索引?

 

用以下数据作为示例进行说明,其中


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 的值,因此我们在这种查询中就可以跳过倒排索引的阶段,类似的查询我们也叫做单时间线查询。

2. GaussDB(for Influx)的实现方案

 

上一章节讲到,如果业务的查询是单时间线查询,我们就可以根据查询语句来确认数据源,而不用再去倒排索引中找。基于这个思路,GaussDB(for Influx)实现了 hint 特性,hint 特性允许客户指定查询跳过倒排索引模块,直接去查找数据,从而进一步提高查询性能。

 

GaussDB(for Influx)通过定义特殊的 hint 语法来识别查询语句是否走倒排索引,系统解析业务查询语句时,如果识别到查询带有 hint 语法,就会跳过倒排索引查找的步骤,直接根据查询语句中 tagset 信息,找到数据源,去存储层查找对应的数据,其逻辑对比如下图:


3. Hint 查询的性能

 

针对单时间线查询的场景下,我们测试了使用 hint 功能和不适用 hint 功能之间的性能。

测试条件为:300 万时间线,单时间线查询;执行查询 1000 次取平均时延。下图为 hint 查询和非 hint 查询的测试结果对比:



从图中可以看出,在相同的查询语句和测试环境下,hint 查询时延明显优于非 hint 查询。

4. 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 方式查询时,一定要确定是单时间线的查询,否则可能会出现查不出来数据的问题。

5. 总结

 

GaussDB(for Influx)通过提供 hint 功能,在单时间线的查询场景下,性能有大幅度的提升,能有效满足客户某些特定场景的查询需求。

 

除了以上优势外,GaussDB(for Influx)还在集群化、冷热分级存储、高可用方面也做了深度优化,能更好地满足时序应用的各种场景。

6. 结束

 

本文作者:华为 云数据库创新 Lab & 华为云时空数据库团队

更多技术文章,关注 GaussDB(for Influx)官方博客:https://bbs.huaweicloud.com/community/usersnew/id_1586596796288328

Lab 官网:https://www.huaweicloud.com/lab/clouddb/home.html

产品首页:https://www.huaweicloud.com/product/gaussdbforinflux.html 


欢迎加入我们!

云数据库创新 Lab(成都、北京)简历投递邮箱:xiangyu9@huawei.com

华为云时空数据库团队(西安、深圳)简历投递邮箱:yujiandong@huawei.com

 

​​点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
揭秘华为云GaussDB(for Influx)最佳实践:hint查询_数据库_华为云开发者社区_InfoQ写作社区