clickhouse的删除和更新
clickhouse不擅长更新和删除操作,更新操作很重,更新是重新创建一个分区,更新完后,太混之前的
ClickHouse提供了DELETE和UPDATE的能力,这类操作被称为Mutation查询,它可以看作ALTER语句的变种。虽然Mutation能最终实现修改和删除,但不能完全以通常意义上的UPDATE和DELETE来理解,我们必须清醒地认识到它的不同:首先,Mutation语句是一种“很重”的操作,更适用于批量数据的修改和删除;其次,它不支持事务,一旦语句被提交执行,就会立刻对现有数据产生影响,无法回滚;最后,Mutation语句的执行是一个异步的后台过程,语句被提交之后就会立即返回。所以这并不代表具体逻辑已经执行完毕,它的具体执行进度需要通过system.mutations系统表查询。注意数据的修改和删除操作是使用MergeTree家族引擎:
ALTER TABLE test_ud
DELETE WHERE id = ‘1’
Received exception from server (version 20.8.3):
Code: 48. DB::Exception: Received from localhost:9000. DB::Exception: Mutations are not supported by storage Log.
删除数据语法:
ALTER TABLE [db_name.]table_name DELETE WHERE filter_expr
示例:
CREATE TABLE test_ud
(
id String,
name String,
job String
)
ENGINE = MergeTree
ORDER BY id;
insert into test_ud values (1,‘zhangsan’,‘coder’) ;
insert into test_ud values (2,‘lisi’,‘coder’) ;
删除数据:
ALTER TABLE test_ud
DELETE
WHERE id = ‘1’
查询数据:
SELECT *
FROM test_ud
查看表存储数据的目录,我们发现表的目录下多出一个文件
修改数据语法,修改数据支持同时修改多个字段
ALTER TABLE [db_name.]table_name UPDATE column1 = expr1 [, …] WHERE filter_expr
ALTER TABLE test_ud
UPDATE name = ‘my’, job = ‘teacher’ WHERE id = ‘2’ ; --但是注意的时候一定指定where条否则会报错,这种语法的where条件也可以使用子查询 ;
查看mutation队列
那么,怎么查看数据是否更新完成了呢?
可以通过system.mutations表查看相关信息:
SELECT
database,
table,
command,
create_time,
is_done
FROM system.mutations
ORDER BY create_time DESC
LIMIT 10;
database: 库名
table: 表名
command: 更新/删除语句
create_time: mutation任务创建时间,系统按这个时间顺序处理数据变更
is_done: 是否完成,1为完成,0为未完成
通过以上信息,可以查看当前有哪些mutation已经完成,is_done为1即表示已经完成。
Mutation具体过程
首先,使用where条件找到需要修改的分区;
然后,重建每个分区,用新的分区替换旧的,分区一旦被替换,就不可回退;
对于每个分区,可以认为是原子性的;但对于整个mutation,如果涉及多个分区,则不是原子性的。
注意事项
更新功能不支持更新有关主键或分区键的列
更新操作没有原子性,即在更新过程中select结果很可能是一部分变了,一部分没变,从上边的具体过程就可以知道
更新是按提交的顺序执行的
更新一旦提交,不能撤销,即使重启clickhouse服务,也会继续按照system.mutations的顺序继续执行
已完成更新的条目不会立即删除,保留条目的数量由finished_mutations_to_keep存储引擎参数确定。超过数据量时旧的条目会被删除
更新可能会卡住,比如update intvalue='abc’这种类型错误的更新语句执行不过去,那么会一直卡在这里,此时,可以使用KILL MUTATION来取消,语法:
kill mutation where database=‘app’ and table=‘test’ // database、table是system.mutations表中的字段
使用建议
按照官方的说明,update/delete的使用场景是一次更新大量数据,也就是where条件筛选的结果应该是一大片数据。
举例:alter table test update status=1 where status=0 and day=‘2020-04-01’,一次更新一天的数据。
那么,能否一次只更新一条数据呢?例如:alter table test update pv=110 where id=100
当然也可以,但频繁的这种操作,可能会对服务造成压力。这很容易理解,如上文提到,更新的单位是分区,如果只更新一条数据,那么需要重建一个分区;如果更新100条数据,而这100条可能落在3个分区上,则需重建3个分区;相对来说一次更新一批数据的整体效率远高于一次更新一行。
对于频繁单条更新的这种场景,建议使用ReplacingMergeTree/CollapsingMergeTree引擎来变相解决。
相关文章:
clickhouse的删除和更新
clickhouse不擅长更新和删除操作,更新操作很重,更新是重新创建一个分区,更新完后,太混之前的 ClickHouse提供了DELETE和UPDATE的能力,这类操作被称为Mutation查询,它可以看作ALTER语句的变种。虽然Mutation…...
微前端 - qiankun
qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。 本文主要记录下如何接入 qiankun 微前端。主应用使用 vue2,子应用使用 vue3、react。 一、主应用 主应用不限技术栈,只需要提…...
前端编辑页面修改后和原始数据比较差异
在软件研发过程中,会遇到很多编辑页面,有时编辑页面和新增页面长的基本上一样,甚至就是一套页面供新增和编辑共用。编辑页面的场景比较多,例如: 场景一、字段比较多,但实际只修改了几个字段,如…...
docker第一次作业
docker第一次作业 1.安装docker服务,配置镜像加速器 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i sdownload.docker.commirrors.aliy…...
Springboot3.0.0+集成SpringDoc并配置knife4j的UI
环境:JDK17,Springboot3,springdoc2,knife4j 4 Springdoc本身也是集成了Swagger3,而knife4j美化了Swagger3的UI Knife4j官网: 快速开始 | Knife4j Springdoc官网 OpenAPI 3 Library for spring-boot 1.pom配置 由于此knife4j内依赖了S…...
电脑运行缓慢?4个方法,加速电脑运行!
“我电脑才用了没多久哎!怎么突然就变得运行很缓慢了呢?有什么方法可以加速电脑运行速度吗?真的很需要,看看我吧!” 电脑的运行速度快会让用户在使用电脑时感觉愉悦,而电脑运行缓慢可能会影响我们的工作效率…...
3.Docker 搭建 MySQL8.0
1、docker仓库搜索mysql docker search mysql2、docker仓库拉取mysql8.0 docker pull mysql:8.0 备注: docker pull mysql //默认拉取最新版本3、查看本地仓库镜像是否下载成功 docker images mysql:8.04、安装运行mysql8.0容器 docker run -p 3306:3306 --name…...
Mybatis的SqlSource SqlNode BoundSql
学习链接 MyBatis SqlSource解析 【Mybatis】Mybatis源码之SqlSource#getBoundSql获取预编译SQL Mybatis中SqlSource解析流程详解 Mybatis TypeHandler解析 图解 Mybatis的SqlSource&SqlNode - processon DynamicSqlSource public class DynamicSqlSource implement…...
html动态爱心代码【二】(附源码)
目录 前言 效果演示 内容修改 完整代码 总结 前言 七夕马上就要到了,为了帮助大家高效表白,下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐,可用于520,情人节,生日,表白等场景,…...
【Rust】Rust学习 第十六章无畏并发
安全且高效的处理并发编程是 Rust 的另一个主要目标。并发编程(Concurrent programming),代表程序的不同部分相互独立的执行,而 并行编程(parallel programming)代表程序不同部分于同时执行,这两…...
系统报错mfc100u.dll丢失的解决方法(完美解决dll问题)
系统文件mfc100u.dll丢失和出错,极有可能是盗号木马、流氓软件等恶意程序所导致,其感染相关文件并加载起来,一旦杀毒软件删除被感染的文件,就会导致相关组件缺失,游戏等常用软件运行不起来,且提示“无法启动…...
docker compose的用法
目录 一、Docker-Compose介绍 1.1 Docker-Compose的概述 1.2 Docker-Compose 用来实现Docker容器快速编排 1.3 Docker-compose模板文件简介 二、YAML简介 2.1 YAML的概述 2.2 YAML的基本语法规则 2.3 YAML支持的数据架构 三、配置内部常用字段 四、Docker-compose 常…...
Linux: 使用 ssh 连接其他服务器
通过ifconfig 查看要连接的服务器地址: ubuntuubuntu1804-0172:/media/sangfor/vdc$ ssh ubuntu192.168.11.49 输入要连接的服务器密码: ubuntua192.168.1149 s password: 连接服务器成功:...
[.NET/WPF] CommunityToolkit.Mvvm 异步指令
我们在开发中, 经常会有这样的需求: 点击按钮后, 进行一些耗时的工作工作进行时, 按钮不可再次被点击工作进行时, 会显示进度条, 或者 “加载中” 的动画 RelayCommand CommunityToolkit.Mvvm 中的 RelayCommand 除了支持最简单的同步方法, 还支持以 Task 作为返回值的异步方…...
热烈祝贺汇隆成功入选航天系统采购供应商库
经过航天系统采购平台的严审,浙江汇隆晶片技术有限公司成功入选中国航天系统采购供应商库。航天系统采购平台是航天系统内企业采购专用平台,服务航天全球范围千亿采购需求,目前,已有华为、三一重工、格力电器、科大讯飞等企业、机…...
2019年3月全国计算机等级考试真题(C语言二级)
2019年3月全国计算机等级考试真题(C语言二级) 第1题 负责数据库中查询操作的数据库语言是 A. 数据定义语言 B. 数据管理语言 C. 数据操纵语言 D. 数据控制语言 正确答案:C 第2题 有关系如下图所示,其违反了哪一类完整性约束 …...
MySQL 游标
文章目录 1.游标是什么2.MySQL 游标3.定义游标4.打开游标5.提取数据6.关闭游标参考文献 1.游标是什么 游标(Cursor)是一种用于处理查询结果集的数据库对象,它允许开发者按照特定的顺序逐行遍历查询结果集中的数据。游标通常用于在数据库中执…...
ElasticSearch 7.4学习记录(DSL语法)
上文和大家一起初次了解了很多ES相关的基础知识,本文的内容将会是实际企业中所需要的吗,也是我们需要熟练应用的内容。 面对ES,我们最多使用的就是查询,当我负责这个业务时,现不需要我去考虑如何创建索引,添…...
全志orangepi-zero2驱动编写2,控制电平高低
使用驱动编写控制高低电平 可看我前俩篇文章: 【1】全志orangepi-zeor2驱动编写 【2】驱动函数框架详解 检索芯片手册关键信息 知道GPIO基地址 知道PC偏移地址 知道想要控制的端口的信息 知道数据位如何操作 代码实操 驱动代码 #include <linux/fs.h&…...
软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章四
软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章四 一、论软件的静态演化和动态演化及其应用1.论文题目2.写作要点和写作素材二、论大规模分布式系统缓存设计策略1.论文题目2.写作要点和写作素材三、论基于REST服务的Web应用系统设计1.论文题目2.写…...
嵌入式Linux动态引脚复用实战:RK3568 GPIO与I2C功能切换详解
1. 项目概述与核心价值在嵌入式Linux开发中,尤其是基于瑞芯微RK3568这类高度集成的SoC平台,引脚复用(Pin Mux)的管理是驱动开发者的基本功,也是从“会用”到“精通”的关键分水岭。很多朋友在初次接触时,往…...
上海国际航运研究中心:全球绿色航运发展报告(2024-2025)
本报告由上海国际航运研究中心与世界海事大学联合编制,聚焦 2024 年 1 月至 2025 年 9 月全球绿色航运发展,围绕政策、机制、清洁能源、减排技术、发展趋势五大核心展开,全面呈现航运业低碳转型的全球格局、关键进展与挑战。一、核心政策&…...
Java程序员必看:收藏这份2026大模型转型攻略,小白也能轻松入行高薪赛道!
Java程序员必看:收藏这份2026大模型转型攻略,小白也能轻松入行高薪赛道! 随着大模型(LLMs)成为IT行业新质生产力的核心引擎,2026年国内大模型核心市场规模将突破700亿元,人才缺口达200万。本文专…...
从设计到部署:一款面向轻量化产线的6轴关节机器人实战解析
1. 为什么轻量化产线需要6轴关节机器人 在小型工件装配场景中,传统机械臂常遇到两个致命问题:一是庞大的机身挤占产线空间,二是固定轨迹动作难以适应多变的工件姿态。去年我参与改造的一条散热器装配线就遇到过这种情况——原有直角坐标机器人…...
3步轻松解锁Cursor Pro完整功能:免费使用AI编程助手的终极指南
3步轻松解锁Cursor Pro完整功能:免费使用AI编程助手的终极指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached …...
AI Coding如何落地APP开发——从个人玩具到公司级降本增效
一、AI 编程能力如何应用到APP开发团队 每天打开新闻都是各种: AI可以取代程序猿、AI可以独立写页面、AI可以独立完成APP,程序员马上要失业了,一个产品经理半天时间就能生成一个带完整页面的活动模块原型;一个运营人员一个小时就…...
HX‑01 USB 音频编码模块:全行业通用的稳定音频核心解决方案
HX‑01 USB 音频编码模块凭借免驱即用、高清语音处理、宽温稳定运行、强抗干扰设计、灵活配置模式的核心优势,不仅在矿山行业构建了可靠的语音通讯体系,更能适配安防监控、智能楼宇、教育会议、工业自动化、机器人设备、医疗健康等多行业场景,…...
Prisma AI插件OpenClaw:用自然语言智能查询数据库
1. 项目概述:一个为Prisma生态注入AI能力的开源插件如果你正在使用Prisma作为你的Node.js或TypeScript项目的ORM(对象关系映射)工具,并且对如何将生成式AI的能力无缝集成到数据库操作中感到好奇,那么你很可能已经听说过…...
构建工程化提示词库:提升AI开发效率与代码质量
1. 项目概述:一个面向开发者的提示词库如果你和我一样,在过去的几年里深度参与了AI应用开发,尤其是基于大语言模型(LLM)的各类项目,那你一定对“提示工程”这个词又爱又恨。爱的是,一段精心设计…...
如何用Draw.io ECE插件绘制教科书级别的电路图?
如何用Draw.io ECE插件绘制教科书级别的电路图? 【免费下载链接】Draw-io-ECE Custom-made draw.io-shapes - in the form of an importable library - for drawing circuits and conceptual drawings in draw.io. 项目地址: https://gitcode.com/gh_mirrors/dr/D…...
