中间件--ClickHouse-7--冷热数据分离,解决Mysql海量数据瓶颈
在web应用中,当数据量非常大时,即使MySQL的存储能够满足,但性能一般也会比较差。此时,可以考虑使用ClickHouse存储历史数据,在Mysql存储最近热点数据的方式,来优化和提升查询性能。ClickHouse的设计初衷就是为了解决大规模数据分析场景下的性能问题,特别是在处理OLAP(联机分析处理)任务时表现优异。
但是,通常不推荐直接使用Clickhouse作为数据库使用,虽然Clickhouse查询大数量时表现优秀,但其本身不支持事务,不具备Innodb锁等机制。Clickhouse其主要作用是优化海量数据的查询问题,所以结合Mysql做冷热数据分离的方式更推荐。海量的冷数据存储在Clickhouse中,最近的热点数据存储在Mysql中。
1、ClickHouse vs MySQL在大数据量场景下的对比
ClickHouse更适合处理海量数据的分析查询,而MySQL更擅长事务处理和频繁的数据修改。
2、具体思路
(1)、数据迁移
- 如果你的业务已经运行在MySQL上,但发现查询性能瓶颈,可以将部分数据迁移到ClickHouse中。
- 通常的做法是将需要频繁分析的历史数据或日志数据导入到ClickHouse,而MySQL继续负责事务处理。
- 迁移工具:
- 可以通过ETL工具(如Apache NiFi、DataX等)将数据从MySQL导出并导入到ClickHouse。
- 或者直接使用ClickHouse的INSERT INTO … SELECT …语句从MySQL中抽取数据。
(2)、数据分层架构
- MySQL作为主数据库:用于存储在线交易数据,支持高频的增删改操作。
- ClickHouse作为分析引擎:定期从MySQL同步数据,或者通过日志(如Binlog)实时订阅MySQL的变化数据,加载到ClickHouse中进行分析。
- 这种架构既能保证事务处理的灵活性,又能充分发挥ClickHouse在分析查询上的优势。
(3)、查询分离
- 将复杂的分析查询从MySQL转移到ClickHouse。例如:
- 如果你需要统计过去一年的用户行为数据,并按月进行汇总分析,这种查询可能会让MySQL不堪重负。
- 而在ClickHouse中,这类查询可以在秒级甚至毫秒级完成。
(4)、数据压缩与列式存储
- ClickHouse的列式存储和高效压缩算法能够显著减少存储空间占用,同时提高查询性能。
- 对于大规模数据集,存储成本和I/O开销往往是性能瓶颈的重要因素,ClickHouse在这方面具有明显优势。
3、具体案例
- 场景:电商网站的日志分析
- 问题:电商平台每天产生大量的用户访问日志和订单数据,存储在MySQL中。随着时间推移,数据量达到TB级别,查询变得越来越慢。
- 解决方案:
(1)、将历史日志数据从MySQL导出到ClickHouse。
(2)、在ClickHouse中创建表,并使用MergeTree引擎进行存储。
(3)、定期将MySQL中的增量数据同步到ClickHouse。
(4)、使用ClickHouse执行复杂的分析查询,例如:
sql示例:
SELECT toDate(event_time) AS event_date, COUNT(*) AS event_countFROM user_logsWHERE event_date BETWEEN '2025-01-01' AND '2025-01-31'GROUP BY event_date;
这类查询在ClickHouse中通常只需几秒钟即可完成。
4、性能对比
场景:5000万条日志数据查询
优化效果:
- 查询速度提升:200倍以上(从分钟级到秒级)。
- 存储成本降低:压缩率高达 17倍(10GB → 600MB)。
可以看到,相同的数据放到Mysql和ClickHouse中,占用的内存节省了90%多,查询的速度也是非常高效的。
5、注意事项
尽管ClickHouse在处理大数据量方面表现出色,但也需要注意以下几点:
(1)、不适合频繁更新:
- ClickHouse不擅长频繁的单行更新或删除操作。如果你的业务需要频繁修改数据,可能需要结合其他工具(如Kafka)来实现增量更新。
(2)、学习曲线:
- ClickHouse的功能和优化方式与传统的关系型数据库有很大不同,团队可能需要时间熟悉其特性和最佳实践。
(3)、数据一致性:
- ClickHouse本身不提供强一致性保证,因此在需要高一致性的场景下,仍需依赖MySQL或其他事务型数据库。
(4)、硬件需求:
- ClickHouse对硬件资源(尤其是内存和CPU)要求较高,尤其是在分布式部署时。
6、数据迁移步骤
(1)、数据迁移
步骤 1:定义历史数据范围
- 时间字段:确保 MySQL 表中存在时间字段(如 create_time 或 update_time),用于划分历史数据和近期数据。
- 迁移条件:例如,将三个月之前 create_time < ‘2025-01-12’ 的数据迁移到 ClickHouse。
步骤 2:迁移历史数据
-
工具选择:
- 全量迁移:使用 mysqldump或mydumper导出历史数据,通过clickhouse-client导入。
- 增量迁移(可选):使用 Canal、Debezium 或 TapData 实时捕获 MySQL 的 Binlog,过滤历史数据并同步到 ClickHouse。
-
迁移示例:
– 在 MySQL 中导出历史数据(示例)
mysqldump -u user -p --where="create_time < '2025-01-12'" dbname table_name > history_data.sql
– 转换为 CSV 格式(如通过脚本或工具)
– 导入到 ClickHouse
clickhouse-client --query="INSERT INTO clickhouse_table FORMAT CSV" < history_data.csv
步骤 3:清理MySQL中的历史数据
- 分区表优化:在 MySQL 中按时间分区,删除旧分区以释放空间(参考知识库[9])。
– 创建分区表(示例)
ALTER TABLE mysql_table PARTITION BY RANGE (TO_DAYS(create_time)) (PARTITION p2024 VALUES LESS THAN (TO_DAYS('2025-01-01')),PARTITION p2025 VALUES LESS THAN (TO_DAYS('2026-01-01')));
– 删除旧分区
ALTER TABLE mysql_table DROP PARTITION p2024;
(2)、查询路由实现
方案 1:应用层路由
- 逻辑判断:在应用代码中根据时间条件决定查询 MySQL 或 ClickHouse。
python示例:
def query_data(start_time, end_time):if end_time < '2025-01-12': // 三个月之前查询 ClickHousereturn clickhouse_query(...)elif start_time > '2025-01-12': // 三个月之内查询 MySQLreturn mysql_query(...)else:合并查询(如需跨时间范围)return merge(mysql_query(...), clickhouse_query(...))
方案 2:中间件路由
- 使用代理工具:如 ProxySQL 或自定义 SQL 路由服务,根据查询条件动态转发请求。
- 示例规则:
- 若查询条件中 create_time < ‘2025-01-12’,则路由到 ClickHouse。
- 否则路由到 MySQL。
7、总结建议
当MySQL在大数据量场景下性能不足时,ClickHouse是一个非常优秀的解决方案,特别是在需要高性能分析查询的场景中。通过合理的数据分层架构和查询分离策略,可以充分利用ClickHouse的优势,同时保留MySQL在事务处理上的灵活性。
不过,ClickHouse并非万能药。它最适合的是只读或批量写入的大数据分析场景。在引入ClickHouse之前,建议充分评估业务需求,并制定清晰的数据迁移和查询优化策略。
逆风翻盘,Dare To Be!!!
相关文章:
中间件--ClickHouse-7--冷热数据分离,解决Mysql海量数据瓶颈
在web应用中,当数据量非常大时,即使MySQL的存储能够满足,但性能一般也会比较差。此时,可以考虑使用ClickHouse存储历史数据,在Mysql存储最近热点数据的方式,来优化和提升查询性能。ClickHouse的设计初衷就是…...
1.1 设置电脑开机自动用户登录exe开机自动启动
本文介绍两个事情: 1.Windows如何开机自动登录系统(不用输密码) 2. 应用程序(.exe)如何开机自动启动 详细解释如下: 一、Windows如何开机自动登录系统(不用输密码) 设备上的工控机,如果开机后都需要操作人员输入密码&…...
vscode stm32 variable uint32_t is not a type name 问题修复
问题 在使用vscodekeil开发stm32程序时,发现有时候vscode的自动补全功能失效,且problem窗口一直在报错。variable “uint32_t” is not a type name uint32_t 定义位置 uint32_t 实际是在D:/Keil_v5/ARM/ARMCC/include/stdint.h中定义的。将D:/Keil_v5…...
动态规划与记忆化搜索的区别与联系
记忆化搜索(Memoization)和动态规划(Dynamic Programming, DP)都是解决重叠子问题的高效算法技术,但它们有着不同的实现方式和特点。 1. 基本概念 记忆化搜索(自顶向下) 本质:带有…...
html+js+clickhouse环境搭建
实验背景: 我目前有一台服务器A,和一台主机B,两台设备属于同一局域网,相互之间可以通讯。服务器A中部署着clickhouse,我在主机B中想直接通过javascript代码访问服务器中的clickhouse数据库并获取数据。 ClickHouse 服务…...
生命护航行动再启航!
温州好人陈飞携防溺水课堂,为乡村少年宫筑起安全防线 图文作者:华夏之音/李望 随着夏日热浪的滚滚而来,楠溪江畔的安全警钟再次响起。在这片如诗如画的土地上,一场旨在保护青少年生命安全的防溺水课堂活动拉开了…...
Android Compose Activity 页面跳转动画详解
下面我将全面详细地介绍在 Compose 中实现 Activity 跳转动画的各种方法,包括基础实现、高级技巧和最佳实践。 一、基础 Activity 过渡动画 1. overridePendingTransition 传统方式 这是最基础且兼容性最好的方法,适用于所有 Android 版本。 实现步骤…...
Android启动初始化init.rc详解
1. Android启动与init.rc简介 1.1 Android启动过程 一张图简单阐述一下 (网络图片,侵删) 1.2 init.rc 简介 Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些…...
Linux驱动开发-①regmap②IIO子系统
Linux驱动开发-IIO驱动 一,regmap二,IIO子系统2.1初始化相关工作2.2 通道2.3 读实现 over 一,regmap 对于spi和i2c,读写寄存器的框架不同,但设备本质一样,因此就有了regmap模型来对其进行简化,提供统一的接…...
HTML5好看的水果蔬菜在线商城网站源码系列模板5
文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址&#…...
L2-033 简单计算器满分笔记
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就…...
其他网页正常进入,但是CSDN进入之后排版混乱
显示不正常,排版混乱 解决方法: ①打开网络设置 ②更改适配器 ③所连接的网络 --右键 属性 然后就可以正常访问了。...
BFC详解
1.定义: FC的全称为Formatting Conttext,元素在标准流里面 块级元素的布局属于Block Formatting Context(BFC)——即block level box都是BFC中布局 行内级元素的布局属于Inline Formatting Context (IFC) 2.那么在哪些情况下会创建BFC? 根元素…...
(H3C)vlan配置实验
1.实验拓扑 2.实验配置 [S1]dis cu #version 7.1.070, Alpha 7170 #sysname S1 # vlan 10 # vlan 20 # interface GigabitEthernet1/0/1port link-mode bridgeport link-type trunkport trunk permit vlan 1 10 20combo enable fiber # interface GigabitEthernet1/0/2port li…...
idea mvn执行打包命令后控制台乱码
首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识 在 JavaScript 开发中,**深拷贝(Deep Copy)**是一个常见需求,尤其是在处理复杂对象和嵌套数据结构时。JSON.parse(JSON.stringify(o…...
搭建用友U9Cloud ERP及UAP IDE环境
应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…...
Linux 系统新磁盘分区XFS挂载
以下是Linux系统中对新硬盘进行XFS文件系统格式化和挂载的完整操作指南: 一、确认硬盘识别 查看已识别硬盘 执行 lsblk 或 fdisk -l 命令,确认新硬盘设备标识(如 /dev/sdb)。 二、硬盘分区(可选) …...
Oracle测试题目及笔记(单选)
所有题目来自于互联网搜索 当 Oracle 服务器启动时,下列哪种文件不是必须的(D)。 A.数据文件 B.控制文件 C.日志文件 D.归档日志文件 数据文件、日志文件-在数据库的打开阶段使用 控制文件-在数…...
C语言链接数据库
目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…...
深入浅出 Redis:核心数据结构解析与应用场景Redis 数据结构
引言:Redis 为何如此之快?数据结构是关键 Redis (Remote Dictionary Server) 作为一款高性能的内存键值数据库,凭借其闪电般的速度和丰富的功能,在缓存、消息队列、排行榜等众多场景中得到了广泛应用。除了基于内存存储这一核心优…...
告别昂贵语音合成服务!用GPT-SoVITS生成你的个性化AI语音
文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天给大家介绍一款AI语音克隆工具——GPT-SoVITS。这款由花儿不哭大佬开发的工具是一款强大的训练声音模型与音频生成工具…...
前沿要塞:Vue组件安全工程的防御体系重构与技术突围
总章数字世界的钢铁长城 在某个凌晨3点的红蓝对抗演练中,某电商平台因组件级XSS漏洞导致千万级用户数据泄露。这不是虚构的灾难场景,而是2023年某A轮企业的真实遭遇。当传统安全方案在新型攻击面前节节败退时,我们需要为Vue组件铸造全新的数字…...
吴恩达深度学习复盘(19)XGBoost简介|神经网络与决策树
XGBoost 多年来,机器学习研究人员提出了许多构建决策树的方法,目前最常用的方法是对样本或决策树的实现收费。其中,XGBoost 是一种非常快速且易于使用的开源实现,已成功用于赢得许多机器学习竞赛和商业应用。 算法原理 基本思想…...
Docker部署禅道21.6开源版本
将数据库相关环境变量分开,增加注释或空格使得命令更易读。 如果你的 MySQL 主机、端口等配置没有变化,应该确保这些信息是安全的,并考虑使用 Docker secrets 或环境变量配置来避免直接暴露敏感信息。 docker run -d -it --privilegedtrue …...
《MySQL:MySQL表结构的基本操作》
创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示列的类型 character set 字符集,如果没有指定字符集,则以所在数据…...
C++解析操作mat文件方法-基于vs2019
前言 工作中需要将C#脚本转为C++,所转脚本主要功能是进行mat数据文件的解析和矩阵运算。 1.C#版本 原C#脚本主要是基于 MathNet.Numerics.data.Matlab、MathNet.Numerics.LineAlgebra.Double、 MathNet.Numerics.LineAlgebra 中的MatlabReader、DenseMatrix、Matrix进行mat文…...
OpenCV 模板匹配方法详解
文章目录 1. 什么是模板匹配?2. 模板匹配的原理2.1数学表达 3. OpenCV 实现模板匹配3.1基本步骤 4. 模板匹配的局限性5. 总结 1. 什么是模板匹配? 模板匹配(Template Matching)是计算机视觉中的一种基础技术,用于在目…...
自已实现一个远程打印方案 解决小程序或APP在外面控制本地电脑打印实现
常规通过小程序或APP在外出时控制本地电脑实现打印功能,可以结合远程桌面技术、云打印服务或开发定制化的远程打印解决方案。 但这里我们采用自已的实现方案来解决 服务器端实现 搭建一个后端socket服务,监听来自手机的打印请求。监听到打印任务后向本…...
Oracle_00000
contents 基本使用 基本使用 Oracle安装后会自动创建sys和system这两个用户。 sys用户:具有最高权限。具有sysdba角色,有create database的权限。该用户默认密码是:manager system用户:管理员用户,具有sysoper角色。没…...
深入剖析 ORM:原理、优缺点、场景及多语言框架示例
ORM 即对象关系映射(Object Relational Mapping),它是一种编程技术,其作用是在面向对象编程语言里,把对象模型和关系型数据库的数据结构之间创建起映射,这样开发者就能够使用面向对象的方式来操作数据库&am…...
ARINC818协议-持续
一、帧头帧尾 SOF 和 EOF 分别代表视频帧传输的开始与结束,它们在封装过程有多种状态,SOF 分为 SOFi 和 SOFn,EOF 分为 EOFt 和 EOFn。传输系统中的视频信息包括像素数据信 息和辅助数据信息,分别存储在有效数据中的对象 0 和对象…...
【uniapp】uni.setClipboardData 方法失效 bug 解决方案
写了一个 copy 方法,但是怎么也没有弹窗复制成功 <text click"toCopy(myInfo.id)">复制 </text> 逐步打印发现 1 正常打印,2 没有打印,说明问题出现在 setClipboardData 方法执行中 toCopy(n) {// console.log(1,ty…...
智能sc一面
智能sc一面-2025/4/17 更多完善:真实面经 Java 的异常分类 异常分为两类,一类Error,一类Execption。这两个类都是Throwable的子类,只有继承Throwable 的类才可以被throw或者catch Error: 表示严重的系统问题,通常与代码无关&am…...
SAP HANA使用命令行快速导出导入
楔子 今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份。 SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁。 由于SAP HANA提供了Hana Studio这个桌面工具来方便运维和DBA使用…...
Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比
Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比 一 基本概述对比 特性DBMS_JOB (旧版)DBMS_SCHEDULER (新版)引入版本Oracle 7 (1992年)Oracle 10g R1 (2003年)当前状态已过时但仍支持推荐使用的标准设计目的基础作业调度企业级作业调度系统 二 功能特性对比 2.1 作业定义能力 …...
【音视频】音视频FLV合成实战
FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流,并将它们编码和封装输出到输出⽂件,输出格式是根据⽂件扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作: avformat_write_header : 写⽂件…...
10.(vue3.x+vite)div实现tooltip功能(css实现)
1:效果截图 2:代码实现 <template><div><div class="tooltip" style="margin-top: 20%; margin-left: 20%; background-color: blueviolet; color: white;...
代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版)
[TOC](代码随想录算法训练营第三十七天| 52. 携带研究材料 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯(进阶版) ) 入营第三十七天 难度:难 计划任务 完成任务 52. 携带研究材料 动态规划五部曲: 1.确定dp数组以及下标含义 dp[i][j]表示从下标[0-i]的…...
数智化招标采购系统分类及功能亮点
数智化招标采购系统是郑州信源公司运用“互联网”、大数据、人工智能、区块链、物联网等新兴技术,结合供应链管理理念,以招标采购为核心,提供交易、管理、数据、服务、监管为一体的高标准采购管理平台,赋能政企用户实现采购业务全…...
CSS appearance 属性:掌握UI元素的原生外观
在现代网页设计中,为了达到一致的用户体验,我们有时需要让HTML元素模仿操作系统的默认控件样式。CSS中的appearance属性提供了一种简便的方式来控制这些元素是否以及如何显示其默认外观。本文将详细介绍appearance属性,并通过实际代码示例来展…...
【JavaScript】二十四、JS的执行机制事件循环 + location + navigator + history
文章目录 1、JS执行机制(事件循环eventloop)2、BOM的window3、location对象3.1 href属性3.2 search属性3.3 hash属性3.4 reload方法 4、navigator对象5、history对象 1、JS执行机制(事件循环eventloop) 以下,两段代码…...
CSS核心笔记002
margin塌陷问题 第一个子元素的上margin会作用在父元素上, 最后一个子元素的下margin会作用在父元素上解决 1. 给父元素设置 不为0的pandding 2. 给父元素设置宽度不为0 的border 3. 给父元素设置样式 overflow:hiddenmargin合并问题 兄弟元素的下外margin和会下面兄弟的上…...
前端路由缓存实现
场景:以一体化为例:目前页面涉及页签和大量菜单路由,用户想要实现页面缓存,即列表页、详情页甚至是编辑弹框页都要实现数据缓存。 方案:使用router-view的keep-alive实现 。 一、实现思路 1.需求梳理 需要缓存模块&…...
加密软件的发展:从古典密码到量子安全
在数字化时代,信息安全已成为个人隐私、商业机密乃至国家安全的重要基石。加密软件作为保护信息安全的核心工具,经历了从简单替换到复杂算法的漫长演变过程。本文将系统梳理加密软件的发展历程,分析当前主流技术,并展望未来趋势。…...
用Zotero + Word 宏,一键插入带超链接的参考文献!
第一步:准备好Zotero Word 确认你已经完成以下准备: ✅ 已安装好 Zotero ✅ 已安装好 Zotero Word 插件(一般自动装好了) ✅ Word 可以正常插入参考文献 ✅ 已插入好一组参考文献(可以先插几个测试) …...
Java SpringBoot的自定义配置
一,一个类多个属性的情况 application.properties配置文件写法 my.config.ip127.0.0.1 my.config.port8080自定义配置类:MyTestConfig import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties…...
Spring Boot 动态热更新 HTTPS 证书的实现与原理
在实际生产环境中,HTTPS 证书定期更新是非常常见的需求。传统方式通常要求重启服务来加载新证书,但在一些高可用系统中,重启服务会造成连接中断和短暂不可用。本篇文章将介绍如何在 Spring Boot 项目中,实现 不重启服务的情况下热…...
天工股份业绩大起大落:2024营收双位数下滑,稳定性或存疑
《港湾商业观察》施子夫 近期,江苏天工科技股份有限公司(以下简称,“天工股份”)拟公开发行股票并在北京证券交易所上市获得中国证监会同意注册,完成上市审核阶段中最后也是最关键的一步。 值得一提的是,…...
深入浅出 NVIDIA CUDA 架构与并行计算技术
🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、CUDA为何重要:并行计算的时代 2、NVIDIA在…...