当前位置: 首页 > article >正文

高频更新下的数据库“体重管理”:一次 XStore 实验分享

最近在一个写入密集型 OLTP 系统中我突然意识到传统关系型数据库就像一个容易发胖的“胖子”每次全表更新空间膨胀越来越明显索引越来越重查询速度也慢慢变“气喘吁吁”。作为 DBA 和开发者我自然想知道有没有更轻盈、更高效的存储方式。在高并发、写入密集的 OLTP 系统中数据库不仅要承载海量数据还要保证响应速度和长期稳定性。然而传统关系型数据库在频繁更新场景下往往会出现“表膨胀”、索引臃肿、查询性能下降等问题就像一个容易发胖的“胖子”让运维和开发都感到压力倍增。这次实验我选择了 OpenTeleDB 的 XStore 存储引擎通过全表更新场景的实测探索它在高频写入下的表现希望直观感受它在空间管理、查询效率以及运维成本上的优势也为设计高并发业务系统提供参考。一、实验环境与思路为了尽量贴近真实业务场景我设计了一个简单的“全表更新”实验创建两张结构完全一致的表一张使用 XStore一张使用 Heap。各自插入 100 万条初始数据。连续执行 5 轮全表更新每轮让所有行的数值加一并更新时间戳。每轮更新后记录表空间大小、索引占用并进行随机查询测试。我想通过这套方法直观感受 XStore 在“减肥”能力、查询效率和索引压力上的表现。二、实验过程2.1 表和数据准备我先创建了两张表-- XStore 表 CREATE TABLE xstore_abc ( id SERIAL PRIMARY KEY, name TEXT, value INT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) USING XSTORE; -- Heap 表 CREATE TABLE heap_abc ( id SERIAL PRIMARY KEY, name TEXT, value INT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );然后插入 100 万条数据INSERT INTO xstore_abc (name, value) SELECT item_ || g, g FROM generate_series(1, 1000000) AS g; INSERT INTO heap_abc (name, value) SELECT item_ || g, g FROM generate_series(1, 1000000) AS g;初始空间对比显示Heap 表比 XStore 表略小一些但差距不大。-- Heap 表空间 SELECT heap_abc AS table_name, pg_size_pretty(pg_relation_size(heap_abc)) AS data_size, pg_size_pretty(pg_total_relation_size(heap_abc)) AS total_size; -- XStore 表空间 SELECT xstore_abc AS table_name, pg_size_pretty(pg_relation_size(xstore_abc)) AS data_size, pg_size_pretty(pg_total_relation_size(xstore_abc)) AS total_size;table_name | data_size | total_size ----------------------------------- heap_abc | 57 MB | 79 MB (1 row) table_name | data_size | total_size ----------------------------------- xstore_abc | 59 MB | 98 MB (1 row)2.2 高频更新我连续执行了 5 轮全表更新每轮更新语句如下UPDATE xstore_abc SET value value 1, updated_at CURRENT_TIMESTAMP; UPDATE heap_abc SET value value 1, updated_at CURRENT_TIMESTAMP;五轮结束后我记录表总空间和索引占用并随机查询若干条记录测试响应时间。记录一下第一轮table_name | data_size | total_size ----------------------------------- heap_abc | 115 MB | 158 MB (1 row) table_name | data_size | total_size ----------------------------------- xstore_abc | 59 MB | 98 MB (1 row)第五轮table_name | data_size | total_size ----------------------------------- heap_abc | 172 MB | 220 MB (1 row) table_name | data_size | total_size ----------------------------------- xstore_abc | 59 MB | 98 MB (1 row)对Heap 表和 XStore 表随机抽取若干条记录并输出查询耗时DO $$ DECLARE t_start TIMESTAMP; t_end TIMESTAMP; rec RECORD; i INT; BEGIN RAISE NOTICE XStore 表循环随机查询开始; t_start : clock_timestamp(); FOR i IN 1..50 LOOP -- 循环 50 次 FOR rec IN SELECT * FROM xstore_abc ORDER BY random() LIMIT 1000 LOOP -- 可选处理 END LOOP; END LOOP; t_end : clock_timestamp(); RAISE NOTICE XStore 表循环随机查询完成耗时: %, t_end - t_start; END $$;XStore 表循环随机查询完成耗时: 00:00:38.429726DO $$ DECLARE t_start TIMESTAMP; t_end TIMESTAMP; rec RECORD; i INT; BEGIN RAISE NOTICE Heap 表循环随机查询开始; t_start : clock_timestamp(); FOR i IN 1..50 LOOP -- 循环 50 次 FOR rec IN SELECT * FROM heap_abc ORDER BY random() LIMIT 1000 LOOP -- 可选处理 END LOOP; END LOOP; t_end : clock_timestamp(); RAISE NOTICE Heap 表循环随机查询完成耗时: %, t_end - t_start; END $$;Heap 表循环随机查询完成耗时: 00:00:34.058193三、我的观察初始空间占用在插入 100 万条数据后Heap 表的数据和总空间分别为 57 MB 和 79 MB而 XStore 表的数据和总空间分别为 59 MB 和 98 MB。可以看出XStore 表在初始状态下略占用更多空间这是因为 XStore 内部为了支持原位更新In-Place Update和 Undo 日志机制会预留一定的额外空间和元数据结构。虽然初始占用略高但整体差距不大。高频更新对空间的影响在连续 5 轮全表更新后Heap 表的总空间从 79 MB 增长到 220 MB数据膨胀明显。而 XStore 表的数据和总空间始终保持在 59 MB 和 98 MB几乎没有增长。这充分体现了 XStore 在高频更新场景下的优势通过原位更新避免了 Heap 表那种因 MVCC 产生大量垃圾行而导致的空间膨胀问题。随机查询性能随机抽取若干记录进行循环查询时Heap 表耗时约 34 秒XStore 表耗时约 38 秒。虽然 XStore 查询略慢但考虑到它在高频更新下能显著节省空间并减少 VACUUM 或表重建的运维成本这种查询开销是完全可接受的。整体优势高频更新友好XStore 的原位更新机制有效控制了数据膨胀。空间稳定即使在大量更新操作后表空间几乎不增长。降低运维成本减少了对 VACUUM 和表重建的依赖适合高并发 OLTP 场景。本次实验清楚地展示了 XStore 在高频更新场景下的优势。虽然初始空间略大、随机查询稍慢但它通过原位更新和 Undo 日志机制大幅减少了表膨胀保持空间稳定降低了运维压力非常适合需要频繁更新的业务场景。可以说XStore 是一种“为更新而优化”的存储引擎它的设计理念和实际效果都值得在数据库架构选型时重点关注。四、我的心得通过这次实验我深刻体会到高频写入场景下传统 Heap 表虽然成熟可靠但在数据膨胀和运维成本上明显吃力而 XStore 的原位更新设计则像给数据库穿上了“轻量装备”让表在频繁更新中保持稳定、不膨胀同时降低了维护复杂度。对于 DBA 来说这不仅减轻了日常 VACUUM 和表重建的负担也让开发者在设计高并发业务时多了一种性能可靠的选择。实验也让我意识到选择存储引擎不仅是性能数字上的比拼更是系统长期可维护性和运维体验的权衡。五、写在最后本次全表更新实验直观展示了 XStore 在写入密集型 OLTP 场景下的优势表空间几乎不增长、索引负担稳定、查询性能可控显著降低了运维压力。虽然初始占用略高、随机查询稍慢但其带来的空间和维护效率提升足以抵消这些小幅开销。总体来看XStore 是一种为高频更新场景量身打造的“轻盈存储”在数据库选型和架构优化中值得作为重要参考。OpenTeleDBhttps://gitee.com/teledb/openteledb

相关文章:

高频更新下的数据库“体重管理”:一次 XStore 实验分享

最近在一个写入密集型 OLTP 系统中,我突然意识到,传统关系型数据库就像一个容易发胖的“胖子”:每次全表更新,空间膨胀越来越明显,索引越来越重,查询速度也慢慢变“气喘吁吁”。作为 DBA 和开发者&#xff…...

多线程 --- 创建线程与线程的属性

(一).线程的概念1.概念在Java中,对线程进程了统一的封装,封装成了Thread类2.run方法在Thread中,有一个run方法,这个方法是一个抽象方法,我们需要重写我们的run方法来进行执行run方法是线程的入口方法,一旦新…...

会 GIS 开发的不一定会前端开发,但会前端开发的一定要会 GIS 开发,这篇文章给你一次性讲清楚

👉 会 GIS 开发的不一定会前端开发,但会前端开发的一定要会 GIS 开发,这篇文章给你一次性讲清楚1. 问题背景(真实场景) 我见过两类开发者: 一类是 GIS 出身,精通坐标系、空间分析,但…...

Dify + Weaviate + Jina Reranker三引擎联调(仅剩最后2%用户未掌握的混合打分策略)

第一章:Dify Weaviate Jina Reranker三引擎联调全景概览本章呈现 Dify(低代码 LLM 应用编排平台)、Weaviate(向量数据库)与 Jina Reranker(语义重排序模型)协同工作的端到端架构视图。三者分工…...

嵌入式音调生成库:基于GPIO+定时器的方波音乐实现

1. TonePlayer项目概述TonePlayer是一个面向嵌入式系统的轻量级音调生成工具库,专为在压电蜂鸣器(Piezo speaker)上播放8位风格音乐而设计。其核心定位并非通用音频解码器,而是聚焦于资源受限的MCU平台(如STM32F0/F1系…...

拓竹-云安全工程师实习生面经

1. 自我介绍 2. 讲项目经历职责背景什么的 3. 对AI和安全的理解 4. XXS是什么,CSP用来干什么的,怎么配置的,XSS如何防御 5. CORS是什么,会导致什么漏洞,怎么防御 6. SSRF是什么?CDN/DNS绑定用来干什么…...

105【SV】SystemVerilog Interview Questions Set 6

📘 SystemVerilog 面试题集 6 —— 验证工程师的“知识锦囊” 在芯片验证面试中,除了基本概念,面试官更关注你解决实际问题的能力。今天,我们继续解析第六组面试题,涵盖随机化、队列、类继承、竞争避免等实用技巧。每个…...

25年的第二题--旅行最短路径问题

暴力解法思路 弗洛伊德算法全图最短路径搜集有 n 个点, 要每个点都走一遍 枚举所有可能的访问顺序(全排列) 对每种顺序, 按顺序走,算总距离 最后输出最小的总距离//计算任意两个点之间的最短路径!暴力全部计…...

【通信观系列】三十七、卫星物联网

卫星物联网卫星物联网的发展背景卫星物联网的应用价值卫星物联网的技术进展2023-04-10 请大家注意,我说的是“物联网”,而不是“互联网”。 众所周知,按使用对象,互联网可以分为“人联网”和“物联网”。我们普通消费者用户使用…...

PowerBI累计求和实战:从帕累托分析到动态度量值(附完整DAX代码)

PowerBI累计求和实战:从帕累托分析到动态度量值(附完整DAX代码) 在电商数据分析领域,识别关键客户和产品是提升运营效率的核心。当我们需要分析哪些20%的客户贡献了80%的营收时,帕累托分析(80/20法则&#…...

Aipy 代码开发的超强能力

# 伪代码示例:使用aipy进行射电干涉测量数据处理 import aipy import numpy as npdef calibrate_uv_data(uv_file):# 创建UV数据对象uv aipy.miriad.UV(uv_file)# 初始化天线阵列aa aipy.cal.get_aa(mwa, uv[sdf], uv[sfreq], uv[nchan])# 相位校准for pol in [xx…...

罗根口播智能体:IP 口播获客必备神器,罗根智能体实现 IP 口播视频自动化生成

文章标签:# 罗根 #罗根智能体 #罗根口播智能体 #IP 口播智能体 #AI 数字人 #智能 Agent 开发框架 #自媒体口播工具 核心关键词:罗根,罗根智能体,罗根口播智能体,IP 口播智能体 一、罗根智能体核心介绍:轻…...

Chandra OCR入门指南:从HuggingFace加载权重到vLLM推理服务的完整迁移路径

Chandra OCR入门指南:从HuggingFace加载权重到vLLM推理服务的完整迁移路径 如果你手头有一堆扫描的合同、PDF报告、数学试卷或者带表格的文档,想把它们一键转换成结构清晰的Markdown、HTML或JSON,那么Chandra OCR就是你正在寻找的工具。 这…...

基于Simulink的自适应反步法(Adaptive Backstepping)控制​

目录 手把手教你学Simulink——基于Simulink的自适应反步法(Adaptive Backstepping)控制​ 摘要​ 一、背景与挑战​ 1.1 非线性系统控制的痛点​ 1.1.1 未知参数的影响​ 1.1.2 传统反步法的局限​ 1.2 自适应反步法的核心优势​ 1.2.1 原理:参数估计+反步设计融合​…...

ComfyUI-WanVideoWrapper实战指南:8GB显存也能玩转14B AI视频生成模型

ComfyUI-WanVideoWrapper实战指南:8GB显存也能玩转14B AI视频生成模型 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 还在为AI视频生成的高显存门槛而苦恼吗?每次尝试运…...

AI4S应用:药物研发中结合自由能计算方法的创新突破

▊ 药物研发中结合自由能计算应用现状 药物分子通过对靶蛋白的识别与结合作用,能够调控靶蛋白功能,进而实现治疗疾病的效果。蛋白质的许多关键生理和药理活动是通过与小分子相互作用来实现,比如酶的催化特性是由其与底物的相互作用所体现的。…...

图文搜索不准?立知lychee-rerank-mm快速部署,精准排序搜索结果

图文搜索不准?立知lychee-rerank-mm快速部署,精准排序搜索结果 1. 为什么需要多模态重排序 在日常使用搜索引擎或内容平台时,我们经常会遇到这样的困扰:明明输入了精确的查询词,返回的结果却总是差强人意。比如搜索&…...

W7500裸机HTTP服务器:基于W5500硬件协议栈的嵌入式LED控制

1. 项目概述httpServer是为 WIZwiki-W7500 开发板定制的轻量级嵌入式 HTTP 服务器示例程序,其核心目标并非构建通用 Web 服务框架,而是以最小资源开销实现对硬件外设(特别是板载 LED)的远程状态控制与交互。该程序直接运行于 W750…...

LIS302加速度传感器SPI驱动开发与嵌入式集成

1. LIS302加速度传感器驱动库深度解析:面向嵌入式系统的SPI接口实现LIS302系列是意法半导体(STMicroelectronics)推出的超低功耗、三轴数字加速度传感器,广泛应用于便携式设备的姿态检测、振动监测、跌落保护及运动识别等场景。该…...

解锁《原神》60帧限制:从硬件封印到视觉自由的进阶指南

解锁《原神》60帧限制:从硬件封印到视觉自由的进阶指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否曾为《原神》那恒定的60帧限制感到困扰?当你的高端显…...

PyTorch Geometric安装避坑大全:从版本地狱到一键成功,我总结了这份Win/Mac/Linux三平台检查清单

PyTorch Geometric跨平台安装终极指南:从版本陷阱到系统级验证 第一次尝试安装PyTorch Geometric(PyG)时,我花了整整两天时间在版本冲突和依赖地狱中挣扎。那些undefined symbol错误和CUDA版本不匹配的报错信息,至今想…...

GDAL3.1.2+VS2015编译指南:如何用CMake搞定PROJ6依赖?附现成编译好的lib文件

GDAL 3.1.2与VS2015深度编译实战:CMake可视化配置与PROJ6依赖全解析 在空间数据处理领域,GDAL作为地理信息系统的"瑞士军刀",其重要性不言而喻。但对于需要在Windows平台下进行二次开发的科研人员来说,从源码编译GDAL往…...

从理论到实践:TimeGAN驱动的时间序列场景生成与多维可视化解析

1. TimeGAN:时间序列生成的革命性突破 第一次接触TimeGAN是在处理一组电力负荷预测数据时遇到的难题——我们只有少量历史数据,却需要模拟未来可能出现的各种用电场景。传统方法要么需要复杂的参数假设,要么生成的序列缺乏时间依赖性。直到发…...

嵌入式轻量级软件定时器:基于时间轮的毫秒级超时管理

1. 项目概述SimpleSoftTimer 是一个面向资源受限嵌入式系统的轻量级纯软件定时器实现,其设计哲学直指嵌入式开发中最频繁也最易出错的场景之一:超时控制。它不依赖硬件定时器外设(如 TIMx)、不引入 RTOS 内核调度机制(…...

C++高并发内存池:内存池调优与测试

前面我们已经完成了三种Cache的设计。本期我们就来调整一下内存池相关的设计问题 相关代码在我的个人gitee:高并发内存池: 个人学习的项目——高并发内存池 目录 对于大于256KB的内存申请释放 释放对象优化 配备内存池申请变量 多线程下与malloc的性能测试对比…...

Youtu-Parsing助力AI编程:自动解析技术文档生成代码片段

Youtu-Parsing助力AI编程:自动解析技术文档生成代码片段 每次接触一个新的开发库或者框架,你是不是也经历过这样的时刻?面对动辄几十页的官方文档,或者一个结构复杂的开源项目README,感觉无从下手。想快速写个Demo试试…...

Troyka-IMU库详解:10-DOF惯性测量单元Arduino驱动开发

1. Troyka-IMU 库深度解析:面向嵌入式工程师的 Amperka 10-DOF 惯性测量单元驱动开发指南1.1 项目定位与工程价值Troyka-IMU 是专为 Amperka 公司推出的10 自由度(10-DOF)惯性测量单元模块设计的 Arduino 兼容库。该模块集成四类高精度传感器…...

从零搭建CarSim与Simulink联合仿真环境:实现定速巡航控制

1. 环境准备与软件安装 第一次接触CarSim和Simulink联合仿真时,我被各种专业术语搞得晕头转向。后来才发现,只要把这两个软件想象成一对默契的搭档——CarSim负责模拟真实车辆行为,Simulink则扮演控制大脑的角色。搭建环境就像组装乐高积木&a…...

无障碍辅助先锋:OpenClaw+QwQ-32B语音控制电脑全流程实测

无障碍辅助先锋:OpenClawQwQ-32B语音控制电脑全流程实测 1. 为什么我们需要语音控制电脑 去年冬天,我的一位因脊髓损伤而行动不便的朋友向我倾诉了他的困扰——每天需要花费大量时间在简单的电脑操作上。一个简单的网页搜索可能要耗费他十几分钟&#…...

中小企业NLP提效方案:MT5中文数据增强镜像在训练集扩增中的落地实践

中小企业NLP提效方案:MT5中文数据增强镜像在训练集扩增中的落地实践 你是不是也遇到过这样的困境?公司想做一个智能客服或者文本分类系统,但手头只有几百条标注数据,模型训练出来效果总是不尽人意。找外包公司标注?成…...