【Clickhouse2022.02 查询优化】

一、现场场景概述

现场每天每张表入库数据量大约2-4亿条,页面涉及到自定义时间段查询(白天08:00-15:00,夜晚23:00-06:00)与不同时间段(最近一天、一周、一个月和全部)的统计指标查询。

二、主要问题

  1. 时间跨度大无查询或查询条件命中数据过多的分页查询场景速度慢
    (主要是数据量过大orderby慢造成的,需要减少数据量)
  2. 需要针对不同时间段的指标进行查询,统计慢
    (不同时间段导致缓存无法复用,需要创建投影以便于统计指标的快速查询)
  3. 时间跨度选择全部时进行单条件查询慢
    (涉及到索引问题,跳数索引值过小,表结构的优化)

三、数据结构优化

  1. 表结构修改
    主键、排序键的选择,优先将初始化默认的排序字段(一般为时间字段)设置为主键或排序键(会默认创建索引),这样初始化页面时正序取数据很方便,并且该字段一般作为热点查询字段。后面的排序键根据其和第一排序键组合查询的顺序进行添加,例如:
CREATE TABLE dns_log ON cluster cluste (`id` UInt64,`session_start_time` DateTime64 (3),`src_ip` String,`src_port` UInt16,`src_area` String,`dst_ip` String,`dst_port` UInt16,`dst_area` String,`answer_ip` String,`answer_area` String,`req_domain` String,`req_type` UInt8,`domain_len` UInt16INDEX idx_rd `req_domain` type bloom_filter() GRANULARITY 4,INDEX idx_si src_ip type bloom_filter() GRANULARITY 4,INDEX idx_di dst_ip type bloom_filter() GRANULARITY 4,INDEX idx_sa src_area type set(3000) GRANULARITY 4,INDEX idx_da dst_area type set(3000) GRANULARITY 4 GRANULARITY 4,INDEX idx_sp src_port type bloom_filter() GRANULARITY 4,INDEX idx_dp dst_port type bloom_filter() GRANULARITY 4,INDEX idx_id `id` type minmax() GRANULARITY 4) ENGINE = ReplicatedMergeTree ( '/clickhouse/tables/{shard}/dns_log', '{replica}' )
PARTITION BY (toYYYYMMDD (session_start_time),toHour (session_start_time))
ORDER BY(session_start_time, domain_len, answer_count,id )
SETTINGS index_granularity = 8192;

2.索引类型修改
之前的索引类型全部是ngrambf_v1,个人对其不了解,之前的同事创建的,参数为官网的默认值,效果比较差。个人感觉这个索引需要跟家了解业务数据的特性,针对性的调整参数。我这边时间紧任务重,没有时间深究,留到以后在深入。

  • Minmax:对于数字有序字段(区间范围)很有效果,我这里的id是根据时间戳和其他一些字段雪花生成的,具备顺序性,故这里修改为Minmax索引。
  • set:我们这边数据90%本都是本省数据,像src_area和dst_area地理位置(城市名称),基数很小,一般都不过1000,为了保险设置的3倍。
  • bloom_filter:针对高基数的字段设置布隆索引,数据的ip、域名等与主键(第一排序键)之间没有什么关联,这里使用的默认参数。

3.跳数索引值的选择
我这里都是GRANULARITY 4 ,这个跳数值其实很依赖于主键的选择,主键和索引字段的关联性越强,就能更好选择合适的值进行设置。我这边主键排序是时间,除了id有点关联,其他的索引字段关联性其实都不强。我这边一个块8192行,每次跳4个块(参考你的数据量大小设置),我这边验证效果还不错。

四、数据导入与导出

修改表结构需要将数据导出备份,重新建表后将数据重新导入。

#数据导出,并且设置执行时长(导出大数据情况下)
nohup  clickhouse-client -h localhost --port 9000 -u default --password Az123456.. --database="dsdbak" --query="select * from dns_log SETTINGS max_execution_time=60000000 FORMAT CSV" > dns_log_local2.csv &
#导入
nohup cat dns_log_local2.csv | clickhouse-client -h localhost --port 9000 -u default --password Az123456.. --database="dsd" --query="INSERT INTO dns_log FORMAT CSV SETTINGS max_execution_time=60000" &

五、查询优化

近5分钟数据查询(大大减少了数据量)
一般应用于近一天、一周、一个月的查询。通过查DATE_ADD函数与MAX查询最新一条数据的方式,找到最新(有数据的时间,不等于now。保证数据查询出的数据不为空)5分钟的数据。代码里要进一步判断,若查询出的结果数量不满足分页条数,还是走之前的逻辑。该方法在实时大数据量的场景,页面初始化加载有明显的提升。

SELECTsession_start_time,src_ip AS srcIp,src_port AS srcPort,src_area AS srcArea,dst_ip AS dstIp,dst_port AS dstPort,dst_area AS dstArea,answer_ip AS answerIp,answer_area AS answerArea,`req_domain` AS reqDomain,req_type AS reqType
FROMdsd.threat_alarm
WHEREsession_start_time >= toDateTime('2023-08-23 10:09:31')and session_start_time <= toDateTime('2023-08-24 10:09:31')and session_start_time >= (SELECTDATE_ADD(minute,-5, MAX(session_start_time)) sstfromdsd.threat_alarm )
order bysession_start_time desc
limit 0,
30

六、创建投影:预聚合|排序

首先投影数据适量,过多的投影会影响集群性能。

--域名分组统计投影
ALTER TABLE dns_log on cluster cluster_3shards_2replicas  ADD PROJECTION dns_log_domain(
SELECT req_domain,count(),max(session_start_time) group by req_domain
);

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

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

相关文章

wepack打包生产环境使用http-proxy-middleware做api代理转发的方法

首先安装http-proxy-middleware依赖&#xff0c;这个用npm和yarn安装都可以。 然后在express服务器的代码增加如下内容&#xff1a; const express require("express"); const app express(); const { createProxyMiddleware, fixRequestBody, } require("h…

线程数过多会造成什么异常?

线程过多可能会导致栈溢出和堆异常&#xff0c;这是因为每个线程都会占用一定的栈空间和堆空间&#xff1a; 栈溢出&#xff08;StackOverflowError&#xff09;&#xff1a; 每个线程都有自己的调用栈&#xff08;stack&#xff09;&#xff0c;栈用来保存方法调用的信息和局部…

代码随想录 Day 48| 198. 打家劫舍 |

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if (nums.size() 0) return 0;if (nums.size() 1) return nums[0];vector<int> f(nums.size()10,0);f[1]nums[0];f[2]max(nums[0],nums[1]);for(int i3;i<nums.size();i){f[i]max(f[…

华为云Stack的学习(八)

九、华为云Stack网络服务介绍 1.网络服务概览 1.1 租户界面的网络服务 租户登入ManageOne运营面后&#xff0c;可在服务列表中查看到网络服务。用户使用网络服务前管理员需要在Service OM上提前创建好外部网络。 1.2 华为云Stack网络服务全景图 1.3 网络服务承载网元 2.虚拟…

Tuxera NTFS 2022 for Mac破解版百度网盘免费下载安装激活教程

Mac打不开移动硬盘”有多种原因&#xff0c;解决办法也不尽相同。它可能是安装的NTFS for Mac读写软件版本和当前macOS系统的兼容问题、或者是Mac没有正常连接硬盘等等。本篇文章就将为您罗列出导致“Mac打不开移动硬盘”的原因和解决办法。 为此不得不使用著名的Tuxera NTFS …

01.自动化交易综述

算法交易的概念&#xff1a; 利用自动化平台&#xff0c;执行预先设置的一系列规则完成交易行为。 算法交易的优势 1.历史数据评估 2.执行高效 3.无主观情绪输入 4.可度量评价 5.交易频率 算法交易的劣势 1.成本&#xff0c;成本低难以体现收益 2.技巧 算法交易流程 大前…

最快的包管理器--pnpm创建vue项目完整步骤

1.用npm全局安装pnpm npm install -g pnpm 2.在要创建vue项目的包下进入cmd&#xff0c;输入&#xff1a; pnpm create vue 3.输入项目名字&#xff0c;选择Router,Pinia,ESLint,Prettier之后点确定 4.cd到创建好的项目 &#xff0c;安装依赖 cd .\刚创建好的项目名称\ p…

云原生Kubernetes:K8S配置资源管理

目录 一、理论 1.Secret 2.Secret创建 3.Secret使用 4.Configmap 5.Configmap创建 6.Configmap使用 二、实验 1.Secret创建 2.Secret使用 3.Configmap创建 4.Configmap使用 三、问题 1.变量引用生成资源报错 2.查看pod日志失败 3.创建configmap报错 4.YAML创建…

网络编程-UDP协议(发送数据和接收数据)

需要了解TCP协议的&#xff0c;可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 TCP/IP参考模型 通过此图&#xff0c;可以了解UDP所在哪一层级中 代码案例 发送数据 package com.hidata.devops.paas.udp;import java.io.IOException; …

ElementUI之登陆+注册->饿了吗完成用户登录界面搭建,axios之get请求,axios之post请求,跨域,注册界面

饿了吗完成用户注册登录界面搭建axios之get请求axios之post请求跨域注册界面 1.饿了吗完成用户注册登录界面搭建 将端口号8080改为8081 导入依赖&#xff0c;在项目根目录使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 -g&#xff1a;将依赖下载node_glod…

配置OSPFv3引入外部路由及路由过滤 华为实验

1.1 实验介绍 1.1.1 关于本实验 在大型园区网络中&#xff0c;往往使用不同的路由协议进行组网&#xff0c;实现全网的网络互通。不同的协议间通信&#xff0c;除了路由协议本身&#xff0c;还需要引入外部路由及路由信息过滤等技术。 本章内容主要介绍OSPFv3路由过滤及引入外…

win使用git(保姆级教程)

序言 上学期间用的git并不多&#xff0c;但是从研三实习以及后面工作来看&#xff0c;git是一项必备技能&#xff0c;所以在此来学习一下。 下载git安装包 打开网站&#xff0c;根据需求来下载&#xff1b;一般按照如下方式进行下载&#xff1a; 然后安装的时候记得按下图勾…

webpack:关于处理html文件的插件html-webpack-plugin、add-asset-html-webpack-plugin

简介 add-asset-html-webpack-plugin 将 JavaScript或CSS文件添加到由html-webpack-plugin插件生成的HTML中去。 html-webpack-plugin 默认配置会在出口目录中&#xff08;通过output.path选项配置&#xff09;生成一个index.html文件&#xff1b; 生成的index.html文件将会…

论文笔记:ViTGAN: Training GANs with Vision Transformers

2021 1 intro 论文研究的问题是&#xff1a;ViT是否可以在不使用卷积或池化的情况下完成图像生成任务 即不用CNN&#xff0c;而使用ViT来完成图像生成任务将ViT架构集成到GAN中&#xff0c;发现现有的GAN正则化方法与self-attention机制的交互很差&#xff0c;导致训练过程中…

《优化接口设计的思路》系列:第四篇—接口的权限控制

系列文章导航 《优化接口设计的思路》系列&#xff1a;第一篇—接口参数的一些弯弯绕绕 《优化接口设计的思路》系列&#xff1a;第二篇—接口用户上下文的设计与实现 《优化接口设计的思路》系列&#xff1a;第三篇—留下用户调用接口的痕迹 《优化接口设计的思路》系列&#…

机器人过程自动化(RPA)入门 2. 录制播放

在计算机上记录用户步骤并回放的功能使机器人过程自动化(RPA)取得了巨大成功。如果没有这一功能,该技术的采用可能会非常缓慢,它将被视为另一种自动化/脚本工具。 在前一章中,我们对机器人过程自动化有了基本的了解。在本章中,我们将了解如何使用录音机作为我们旅程中自…

知识库搭建保姆级教程,如何从0到1完成知识库搭建

在这个信息爆炸的时代&#xff0c;如何获取、整理和应用知识成为了我们个体价值和企业核心竞争力打造的重要表现&#xff0c;搭建一个高效的知识库可以提升我们企业的竞争力&#xff0c;必要时还能快速切换赛道&#xff0c;开展一个新的领域。 今天我们将结合HelpLook 来与你一…

行为型模式-解释器模式

提供了评估语言的语法或表达式的方式&#xff0c;它属于行为型模式。这种模式实现了一个表达式接口&#xff0c;该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 意图&#xff1a;给定一个语言&#xff0c;定义它的文法表示&#xff0c;并定义一个解释…

Flink RoaringBitmap去重

1、RoaringBitmap的依赖 <!-- 去重大哥--> <dependency><groupId>org.roaringbitmap</groupId><artifactId>RoaringBitmap</artifactId><version>0.9.21</version> </dependency> 2、Demo去重 package com.gwm.driver…

SpringBoot-Druid

目录 1.什么是Druid 2.主要优点和原因 3.误区 4.Part代码 0.pom 1.Spring.datasource.type: com.alibaba.druid.pool.DruidDataSource 2.Druid用Jasypt加密任意内容 EnableEncryptableProperties开启加密注解 3.Druid监控平台 1.什么是Druid Druid 是一个开源的数据库…