Database

234 篇内容

工程实践ClickHouse Engineering

Can your Postgres survive a bad query?

文章讨论 Postgres 在坏查询和内存压力下的可靠性,先解释 work_mem 按查询节点和后台进程分别生效、hash_mem_multiplier 与并行 worker 会成倍放大内存占用,并说明递归 CTE 的 UNION 去重哈希表无法落盘、会持续增长到查询结束。随后用一个约 1260 万节点的递归 UNION 查询,在 ClickHouse Managed Postgres、Cloud SQL、PlanetScale Postgres 和 Amazon RDS 上做并发压测,比较查询失败、会话失败和集群崩溃三种失败模式。结论是 ClickHouse 通过禁用内存 overcommit 并设置上限,让单个查询以 SQL ERROR 失败而集群保持存活;RDS 等则可能触发 OOM killer 并进入数分钟崩溃恢复。边界在于这是厂商自测,各服务的配置、内存上限和缓存策略不同,结论可能有利于自身策略。

推荐收录,因为文章既讲清了 Postgres work_mem、并行 worker 和递归 CTE 内存不可控的具体机制,又给出跨四家托管服务的可复现压测方法与失败模式分类。适合 DBA、SRE 和后端工程师在数据库选型、坏查询防护、内存上限与故障隔离设计时参考,但需警惕厂商自测和配置差异带来的公平性风险。

工程实践ScyllaDB Engineering

Building a Faster (Rust-Based) Python Driver for ScyllaDB

本文介绍用 Rust 重写 ScyllaDB Python 官方驱动的原因、设计与性能结果。作者选择 PyO3 作为 Rust-Python 绑定层,并通过同步/异步微基准说明小值调用开销可忽略,但大对象跨语言传递和大量小任务调度会显著变慢。序列化最终放在 Rust 侧,反序列化对原生 CQL 类型复用 Rust 现有逻辑、对复杂类型直接构造 Python 对象;借助 yoke 实现零拷贝结果迭代,以绕过 PyO3 无法暴露非静态生命周期的问题。分页、错误处理与元数据缓存也针对 Python 习惯做了重新设计,基准显示在插入、查询和并发场景下明显优于旧版驱动。文章也指出截至 2026 年 6 月该驱动尚未生产就绪,TLS、重试、负载均衡等仍在评审,兼容旧 API 也尚未完成。

推荐收录:文章给出了可复现的微基准与端到端对比,并详细记录 PyO3 绑定、序列化策略、yoke 零拷贝、分页与错误映射等工程取舍,证据链完整。适合数据库驱动、Rust/Python 互操作、性能优化与 API 设计方向的工程师阅读,其中“大对象避免跨 FFI 传递、大任务优于小任务”等结论可直接迁移。风险是驱动尚未生产就绪,部分能力仍在评审,读者需注意其阶段性结论。

工程实践ClickHouse Engineering

chDB Durable Layer for agent memory

本文介绍 ClickHouse 团队为 agent memory 设计的 chDB Durable Layer。作者先复现问题:基于嵌入式 OLAP 引擎 chDB 构建的 agent memory 状态只能停留在单机磁盘,无法在 CI、短生命周期沙箱和第二台机器上复用,而已有方案(SQLite checkpointers、SQLite+Litestream、Postgres/pgvector/服务端 ClickHouse、Cloudflare Durable Objects、本地 DuckDB/chDB)在可移植性与本地热路径之间各有取舍。核心方案是“本地工作副本 + 对象存储权威副本”两层结构:查询仍在进程内 chDB 上执行,以显式 flush() 作为持久化边界,checkpoint() 折叠 WAL,head.json 配合条件写实现单写者租约与 fencing。文章给出 append-only 表建模、冷热分层、ZSTD 压缩(1.45GB 转录压至 521MiB)、本地查询比远程快 58 倍等实践数据,并以 ClickMem、Maple Local、ReplayHouse、vcfclick 为例。边界包括单写者、V1 WAL 要求确定性语句、不适合 OLTP 与多写者共享场景。

推荐收录,因为它从真实工程问题出发,给出可复用的架构取舍:本地工作副本与对象存储权威副本分工、显式 flush()/checkpoint() 持久化边界、基于 head.json 条件写的单写者租约,并附方案对比表、压缩与延迟实测以及建模最佳实践。适合为 agent/LLM 应用设计记忆与持久化层的工程师,以及需要嵌入式 OLAP 可恢复状态的读者;主要限制是仅适用单写者、单用户/单项目场景,多写者共享仍需服务端数据库。

工程实践TiDB 社区博客 - 实践案例

一个 4000 行的大事务,把政务云的 TiDB 锁卡了 9 分钟

文章复盘某区县级政务云 TiDB 6.5 集群的线上事故:凌晨批量对账把约 4000 行更新包在单个大事务中,提交时间从 30 秒拖到 9 分钟,锁长期不释放,拖垮白天查询。作者用 Grafana 指标、慢日志、cluster_transactions 和 tidb-trace 定位根因,即大事务跨 200 多个 Region 放大两阶段提交开销,叠加热点 biz_no 形成写热点 Region 排队。处理分三步:拆成每 200 行一个小事务、主键加随机分片位打散热点、调整 txn_commit_batch_size 与 txn.max-commit-txn 并错峰调度。改后单事务锁持有时间降至 15 秒内,热点 Region 冲突从数千降到个位数,TiKV CPU 回落到 55%。其排障顺序与拆分思路可迁移,但结论源于单一政务云场景和特定版本,参数调整仍需结合集群规模评估。

推荐收录,因为文章完整呈现了从监控指标异常、捞取长事务、链路追踪到根因归因与效果验证的排障闭环,并给出拆分事务、热点打散、参数兜底三刀的具体做法和量化结果。对使用 TiDB 等分布式数据库、需要写批量任务或排查锁等待与热点 Region 的工程师有直接迁移价值;但结论基于特定版本与政务云规格,参数调整需结合自身集群验证。

工程实践PlanetScale Blog

Handling hot shards

文章以 PlanetScale 的 Neki 分片方案为背景,讨论多租户场景下的热分片问题:按 tenant_id 均匀分布租户在业务增长后会失效,出现超大租户压垮单个分片、跨租户查询增多等情况,即租户均匀不等于数据均匀。作者引用 Slack 使用 Vitess 的真实案例,说明 messages 表从按 workspace 分片改为按 channel 分片后,把常用的单分片查询保持在一起、把跨分片查询限制在批量或管理路径,从而降低热点并获得 CPU 与存储余量。文中给出三级处置路径:纵向扩容、按 key range 隔离大租户,以及最终按访问模式和查询形状重新分片部分表,并说明 Neki 用声明式 data topology 与在线 Reshard 在不停机的情况下迁移数据。边界在于内容带有产品宣传色彩,缺少性能基准和失败案例,Postgres 与 MySQL 的表述也略有出入,读者需结合自身系统验证。

推荐收录:文章把热分片的成因与三类处置路径(扩容、按 key range 隔离大租户、按访问模式重分片)讲得具体,并给出 Slack/Vitess 的迁移决策依据与 key range 配置示例,可迁移到多租户 SaaS 的分片键复审。适合负责分库分表、租户隔离与在线扩容的工程师和架构师;但结论围绕厂商产品,缺少量化基准,引用前需自行压测验证。

技术文章QuestDB Engineering

Read Which time-series join? ASOF, WINDOW, HORIZON, LT or SPLICE

文章系统比较 QuestDB 的五种时序 JOIN:ASOF、WINDOW、HORIZON、LT、SPLICE,并说明 LATERAL JOIN 如何按行复用它们。作者以 FX 交易与行情表为例,在公开 demo 上给出可运行 SQL,解释每种连接的时间匹配方式、返回行数、聚合行为和典型用途:ASOF 取事件时刻的最新值,WINDOW 聚合时间窗口内多行,HORIZON 在多个固定偏移上重复 ASOF,LT 取严格早于当前时间戳的前值,SPLICE 实现双向全外 ASOF。文章还讨论 TOLERANCE、EXCLUDE PREVAILING、CTE 组合限制、WINDOW 与 HORIZON 的混淆、LT 避免前视偏差等边界。最后提醒 demo 数据为合成数据,应关注查询语义而非市场结论。

推荐收录:文章不是泛泛介绍,而是用一组可运行 SQL 和返回行数直接证明五种时序 JOIN 的语义差异,并给出选择依据与组合限制。它适合数据库、时序数据分析、量化/监控系统开发者作为查询设计与选型参考,ASOF/WINDOW/HORIZON 的区别和 LT 防前视偏差等方法可迁移到其他时序系统;主要风险是语法和部分行为绑定 QuestDB。

技术文章PlanetScale Blog

When to choose x86-64 vs aarch64

文章讨论云端 Postgres 选择 x86-64 还是 aarch64 的实际影响。作者从超线程与 vCPU 定义切入:x86 常把超线程线程计为 vCPU,而 Graviton、Axion 等 ARM 芯片每 vCPU 对应完整物理核,因此 ARM 适合高并发小查询,x86 凭借更高单核频率适合少量 CPU 密集型大查询。文章还比较向量宽度,指出 x86 的 AVX2/AVX-512 比 Graviton 的 128 位向量更有利于 TIN 索引和 pgvector 的部分计算。随后说明 Postgres 文件不可跨架构直接复制,并用 pg_trgm 的 char 符号性差异解释复制风险,切换需逻辑复制到新集群。最后建议普通负载默认 ARM,CPU 重型负载重点测试 x86,迁移前做同数据同并发基准并衡量成本。

推荐收录:文章把架构选择落到 vCPU 语义、单核/多核取舍、向量指令宽度和 Postgres 物理复制限制上,并给出 PlanetScale 生产约束与迁移路径,证据具体而非泛泛而谈。适合数据库/基础设施工程师在选型、性能调优或跨架构迁移前阅读,可迁移到其他依赖底层架构的数据库与搜索负载。风险是部分结论来自厂商视角,读者仍需自行用同数据同并发基准验证。

技术文章DuckDB Engineering Blog

DuckDB and Hugging Face: Querying Datasets Directly

文章介绍 DuckDB 通过 hf:// 协议直接查询 Hugging Face Hub 数据集的集成方案。自 v0.10.3 起,DuckDB 在 httpfs 扩展上支持 hf:// 路径,可把数据集仓库解析为 CSV、JSONL 或 Parquet 文件,无需先下载即可用 SQL 读取,并支持通配符扫描多文件、列裁剪、@ 版本固定和 ~parquet 分支。文章给出探索数据集、过滤采样、基准评测、与自有表连接和可复现分析等典型用例,还说明私有/门控数据集可通过 Secrets Manager 配置 token。边界在于公共数据集开箱即用,重复查询建议物化为本地表,整体更偏重官方用法与操作指南,未深入讨论远程读的性能模型和异常处理。

推荐收录:来源为 DuckDB 官方工程博客,提供了可直接运行的 SQL 代码、版本固定与私有数据集配置等具体证据,展示如何把 Hugging Face 数据集纳入本地 SQL 分析工作流。适合数据工程、ML 工程和需要快速探查/采样训练数据的读者,方法可迁移到其他远程 Parquet 数据集场景;主要不足是内容偏用法指南,缺少性能边界与失败模式的深入分析。

技术文章SelectDB 技术分享

Apache Doris 高性能 Open Lake Variant 读写技术解析 面对日志、事件、AI 调用等不断变化的半结构化数据,如何既保留灵活结构,又实现高效查询?从 Doris 4.2 ...

Doris 4.2 起可在 Iceberg、Paimon 上直接读写 VARIANT 半结构化数据。文章分三层讲解:值由 metadata 字段名字典与 value 二进制编码,可按路径拆成类型子列,类型不匹配的值保留在 residual/fallback;读取按文件与 Row Group 选择叶子投影、残余补齐或完整投影,并结合统计裁剪;执行层保留 Encoded、Typed、Shredded 三种形态并延迟物化,避免重建完整对象。写回时 Iceberg 经 Arrow 生成 Parquet,Paimon 经 JNI 交给原生 writer,当前不回写拆列文件。测试称相比 Spark 冷跑 15.10×、热跑 19.14×,拆列热跑 58.64×,但 SQL 示例未在集群执行。

Doris 团队完整拆解了 Variant 的编码、拆列、按路径读取与延迟物化机制,并给出可观测的 Profile 指标和冷热跑对比数据,可作为湖仓半结构化数据格式设计与查询优化的参考。适合从事 OLAP/湖仓选型、Parquet 列裁剪与执行引擎优化的工程师阅读;需注意性能数字来自厂商自测、不含导入耗时,SQL 示例也未实机验证。

工程实践TiDB 社区博客 - 实践案例

热点 Region 逼停了写入:一次 TiDB 写入性能雪崩的 6 小时排查

文章复盘一个城市大脑 IoT 实时写入项目在 TiDB 6.5 上的写入性能雪崩排查。上线两周后批量写入超时、QPS 从 8k 降至 3k、单个 TiKV CPU 达 90% 而其余空闲,并频繁出现 Region is hot 告警。作者用 pd-ctl region top write 定位到某 Region 占全集群 70% 以上写流量,根因是 AUTO_INCREMENT 单调递增主键使新行持续写入尾部 Region。采用 SHARD_ROW_ID_BITS=4 与 PRE_SPLIT_REGIONS=4 重建表并迁移后,延迟回到 5~8ms;7.x 可改用 AUTO_RANDOM。文末总结高写入表设计、热点观察、压测需模拟真实分布等建议,但属于单一集群案例,未展开其他热点类型与迁移成本。

推荐收录。文章给出从告警、指标异常到 pd-ctl 热点定位、根因解释、表重建与迁移验证的完整闭环,证据具体且可复现。对使用 TiDB 或分布式数据库的工程师,自增主键导致写入热点、SHARD_ROW_ID_BITS 打散和压测需覆盖真实写入分布等结论可直接迁移;但结论主要适用于 TiDB 6.5 单集群,其他系统需自行验证。

技术文章TiDB 社区博客 - 技术解读

我的TiDB 架构原理概念学习

文章系统梳理 TiDB 的分布式架构原理,围绕分层解耦与计算存储分离展开。先介绍 TiDB Server、PD、TiKV、TiFlash 四组件职责,再说明 Region 分片、RocksDB 双实例、Raft 多副本与 PD 调度机制;随后解释基于 Percolator 和 MVCC 的分布式事务,以及乐观/悲观两种模式。接着讨论 HTAP 双引擎:TiFlash 以 Raft Learner 异步同步、ReadIndex 一致性读取和 MPP 并行执行支撑分析查询,最后总结计算下推等优化原则。内容适合作为入门概览,但对具体源码、调优参数、故障案例与实验数据展开较少。

推荐收录:文章以分层解耦为主线,完整串联 TiDB 四组件、Region/Raft 存储机制、Percolator 事务和 TiFlash HTAP 协同,能帮助读者建立分布式数据库的全局架构认知。对需要理解计算存储分离、多副本一致性与 HTAP 取舍的开发者、DBA 和系统设计者具有迁移价值;不足是偏概念综述,缺少源码、参数调优和故障案例,适合入门与复习而非深度排障。

技术文章Greptime 技术

JSON Is No Longer a Blob: Inside GreptimeDB 1.2's New JSON Type

文章深入解析 GreptimeDB 1.2 新增的 JSON2 类型,针对传统 JSONB 按整文档存储、分析查询需读取并解析完整 JSON 的问题。其核心是有界自动 shredding:高频路径展开为独立列,并分为静态类型路径、预算内动态路径和 Parquet Variant 余量三层;查询时通过类型具体化从 SQL 推断所需结构类型,类型提示可固定路径类型并拒绝不匹配写入。结论是 JSON2 适合日志、trace 等可观测性场景,能按路径裁剪读取且保留原始嵌套;但冷路径仍需读余量,类型推断可能出错,自动展开有上限,1.2 中修改配置尚未正式支持。

推荐收录:文章不仅介绍功能,还给出 JSONB 与 JSON2 的读写差异、三层存储、类型具体化、类型提示和完整 SQL 示例,并引用 JSONBench 数据说明边界。适合数据库、存储引擎、可观测性平台工程师理解半结构化数据的列式化设计;可迁移到日志/trace 分析中的路径裁剪、列式存储和类型约束设计,但需留意冷路径读取与类型推断错误风险。

技术文章Greptime 技术

JSON Is No Longer a Blob: Inside GreptimeDB 1.2's New JSON Type

文章解析 GreptimeDB 1.2 新增的 JSON2 类型,面向日志、Trace 等路径繁多但查询只访问少数路径的 JSON 数据。传统 JSONB 按整文档存储,读一个字段也需扫描和解析完整文档,索引无法消除这类 I/O 与 CPU 放大。JSON2 采用有界自动 shredding,将热路径展开为独立 Parquet 列,长尾写入 Parquet Variant remainder,并支持 type hints 固定类型;查询端通过 query type concretization 从 SQL 推导结构化类型,实现列裁剪与向量化执行。局限是类型推断依赖 SQL 表达式,写错可能返回无意义结果,且 1.2.x 不能修改已有 JSON2 配置。该方案适合可观测性分析,但冷路径仍需读 remainder,自动展开预算默认 100。

推荐收录。文章基于 GreptimeDB 1.2.1 的真实实现,清晰给出 JSONB 整文档读放大、JSON2 有界 shredding、Parquet Variant remainder、query type concretization 与 type hints 的设计细节和 SQL 示例,并明确说明类型推断错误、冷路径成本和 1.2.x 配置不可变等边界。适合数据库内核、存储引擎和可观测性平台开发者参考,其“热路径列化+长尾归并+查询驱动类型推导”的取舍可迁移到其他半结构化分析系统。

工程实践ScyllaDB Engineering

Building a Faster C# Driver for ScyllaDB…on our Self-Baked C#-Rust FFI Framework

本文复盘 ScyllaDB 用自研 C#-Rust FFI 框架重写 C# 驱动的实践,目标是在保持原 DataStax C# 驱动 API 基本不变的前提下复用 Rust 驱动的性能与正确性。作者利用 .NET 5 的改进互操作特性降低跨语言开销,并桥接 .NET 与 Tokio 异步运行时以避免阻塞线程。文章详述了序列化放在 C# 侧、以 RWLock 解决会话关闭的 TOCTOU/UAF 竞争、用 trait 映射错误、以原子快照管理元数据、转发 Rust 日志等取舍。基准显示新驱动在所有场景不慢于原驱动,高并发下约快一倍。当前开发暂停,功能完整性与维护仍待完善。

推荐收录:文章完整呈现 C#-Rust FFI 框架设计、TOCTOU/UAF 竞争修复、元数据快照与错误映射等关键取舍,并附可复现基准(高并发下约为原驱动两倍、接近 Rust 驱动)。对从事跨语言互操作、数据库驱动或高性能客户端开发的工程师有直接参考价值,会话生命周期管理、内存引用计数等模式可迁移。项目开发暂停是主要风险。

科研议题知乎 - 胡津铭

数组作为buffer pool,这也行??

本文由论文作者介绍其参与的一篇 SIGMOD 2027 工作,提出名为 Calico 的基于数组的 buffer pool 设计。作者先分析现有方案:LeanStore 的翻译设计不支持图等数据结构,vmcache 依赖 mmap 而在数据库中带来诸多不便。Calico 的核心思路是跳过 hashmap 直接用数组实现 buffer pool,利用其轻量、局部性好和支持组预取的优势,并通过多级翻译(前缀加后缀)与路径缓存解决 page id 稀疏问题,可类比为用户态的 page table 实现。作者将 Calico 集成进 PostgreSQL,在线性扫描、join 和向量检索场景下分别获得 50% 至 200% 和 4-6 倍性能提升,向量检索甚至超过 faiss。文章为作者视角的概览,未展开全部实验细节与局限。

推荐收录。文章出自论文作者本人,清楚交代了 Calico 的问题动机(LeanStore 局限与 mmap 弊端)、关键设计(数组 buffer pool、多级翻译、路径缓存)以及集成 PostgreSQL 后的量化收益,并说明了向量检索等适用场景。对从事数据库存储引擎、向量检索系统或性能优化的读者,可迁移其“简单结构加精细细节设计”的思路;主要不足是缺少实验边界与失败情形的深入讨论。

工具笔记DuckDB Engineering Blog

DuckDB Now Ships inside dbt v2

文章介绍 dbt v2(基于 Rust 的 Fusion 引擎)首次内置 DuckDB 适配器。作者回顾 v1 需单独安装 Python 包 dbt-duckdb,而 v2 改为 Rust 单仓 + ADBC 驱动,并自动下载缓存 DuckDB 驱动,配置一个 profile 即可运行。v2 新增 DuckLake 与 Iceberg REST 目录支持(需 use_catalogs_v2 标志)、将 dbt 元数据写成可查询 Parquet、提供原生 SQL 语义理解与列级血缘,并固定 DuckDB 版本以推下更多原生函数。迁移可先在 v1.12 用 opt-in v2 parser 验证,再用 dbt-autofix 和升级指南切换。文章偏功能与用法说明,缺少性能基准和取舍分析,适合使用 dbt/DuckDB 的数据工程读者。

推荐收录:文章给出了 dbt v2 内置 DuckDB 的配置方式、DuckLake/Iceberg catalog、Parquet 元数据查询和迁移路径,属于可操作的工具集成参考。适合数据工程师和分析工程师了解本地 dbt 工作流及 v2 迁移。需注意它偏功能公告,缺少性能与取舍验证,版本锁定可能带来后续适配成本。

技术文章PlanetScale Blog

Anatomy of a (Postgres) search engine

文章系统讲解全文搜索倒排索引的内部结构,并落到 Postgres 场景说明工程实现。核心组件包括词项字典、postings list、位置数据与词频统计;postings 通常有序存储,并用差值编码、位图压缩减少空间,以支持并集/交集、短语和跨度查询。查询侧还讨论 tokenizer、停用词、词干化带来的精度取舍,以及 BM25 打分和 top-k 通过块级统计跳过 postings 的优化。更新删除依赖不可变 segment、tombstone 和后台 merge,但合并带来大量 I/O 与临时空间,删除则造成空间放大和过滤开销。最后分析 Postgres 集成约束,包括 ctid 映射、WAL、VACUUM、可见性映射、查询规划器与 CustomScan。文章偏概念性综述,TIN 的性能数据和实现细节需阅读另一篇深潜。

推荐收录:文章完整解释倒排索引的词项字典、postings 压缩、BM25、segment 合并与 Postgres 集成约束,技术证据密度高。适合数据库、搜索和后端工程师建立系统认知,也可迁移到 Lucene、Elasticsearch 类系统的选型与调优。主要局限是概念综述,TIN 的具体性能数据需参考另一篇深潜。

工程实践ClickHouse Engineering

Postgres on NVMe: performance and the convergence of transactions and analytics

文章以 Postgres 在本地 NVMe 上的性能表现为切入点,在 482 GiB 数据集上对比 NVMe 与 gp3 EBS,测得 NVMe 吞吐约 9.2 倍、UPDATE 延迟 4.0 ms 对 36.9 ms。作者用 pg_stat_activity 和 CPU profile 解释:EBS 下大量后端阻塞在 DataFileRead,NVMe 将缓存未命中从毫秒级降到微秒级,并改善 VACUUM 与逻辑解码。针对本地 NVMe 的临时性,文章提出跨 AZ quorum 同步复制加 WAL-G 持续归档来保证持久性与可恢复性。随后论证存储加速只能提高行存上限,无法替代列存做大规模扫描,需用 CDC 将数据同步到 ClickHouse。适用时需注意 NVMe 容量受实例限制、复制与归档增加运维复杂度,且查询下推覆盖度需验证。

推荐收录:文章给出可复现的 benchmark 设计(pgbench 33,000、482 GiB、NVMe 对 EBS)和从 pg_stat_activity、CPU profile 到 VACUUM、逻辑解码的分层证据,并讨论本地 NVMe 临时性下的 quorum 复制与 WAL 归档方案。适合负责 PostgreSQL 性能、存储选型或 HTAP/CDC 架构的工程师,其中“存储解决 OLTP、列存解决 OLAP”的拆分逻辑可迁移。需注意文章来自 ClickHouse 厂商,benchmark 与产品推荐带有一定立场,pushdown 和运维复杂度仍需结合场景验证。

工程实践PlanetScale Blog

Blocking cutovers to save replication slots

文章介绍 PlanetScale Postgres 为何会在主从切换时因逻辑复制槽未就绪而主动阻断 cutover。作者先区分物理槽与逻辑槽:物理槽供副本记录 WAL 进度,逻辑槽则把 WAL 解码为面向 CDC 消费者的事件流;若提升的副本没有同步的逻辑槽书签,下游会丢失事件或停摆。PlanetScale 的 Kubernetes operator 会检测 failover、hot_standby_feedback、sync_replication_slots 等配置,发出告警并在计划内切换前等待槽 ready,从而避免静默数据丢失。正确配置包括创建槽时设置 failover=true、在控制台登记槽名,并开启 hot_standby_feedback 与 sync_replication_slots;后者默认关闭,因为会带来 vacuum horizon 固定、主库膨胀和长事务风险。该方法主要面向 PlanetScale Postgres 和逻辑复制槽场景,并非完整搭建指南,且宽限期后仍允许强行切换。

推荐收录,因为文章给出了具体可验证的故障模式、参数配置和平台阻断策略,清楚解释了逻辑复制槽未同步时切换会造成下游数据丢失。适合 PostgreSQL、SRE、CDC 与数据管道维护者阅读,其 failover=true、slot 登记和 hot_standby_feedback 权衡可迁移到自建高可用集群;注意其行为与 PlanetScale 平台托管能力强绑定,原生 Postgres 需自行补齐自动化与保护逻辑。

科研议题知乎 - 胡津铭

数据库应该如何写SSD

本文解读 VLDB 2026 荣誉提名论文《How to Write to SSDs》,介绍 TUM Viktor Leis 团队提出的软硬件协同设计(hardware-software codesign)思想。文章指出,B+ 树数据库沿用机械硬盘时代找到数据页后原地更新(in-place write)的方案,在 SSD 上会因硬件层面的 out-of-place write 特性产生严重写放大,拖慢写入效率。团队据此设计面向 SSD 的 B+ 树 out-of-place write,并配合压缩、页打包、按死亡时间分组、对齐数据库与 SSD 垃圾回收粒度等优化,核心论点是数据库比操作系统和硬件更了解工作负载,因而拥有更多信息优化系统。该方案用于 LeanStore 后,在 YCSB 和 TPC-C 上写放大降低约 7 倍、吞吐量约翻倍。文章偏重思想梳理、未展开技术细节,读者需回看论文原文。

推荐收录:文章把一篇 VLDB 论文的核心问题、协同设计思路和量化结果(写放大约 7 倍、吞吐翻倍)讲清楚,并点明“数据库比 OS/硬件更懂工作负载”这一可迁移原则。适合做数据库存储引擎、SSD 写路径或硬件协同优化方向的读者快速建立线索,不足之处是省略了技术细节,需结合原文阅读。

科研议题知乎 - 胡津铭

F3:面向未来的文件存储格式设计

本文解读清华张焕晨团队与CMU的Andy老师合作、获SIGMOD 2026 Honorable Mentions的论文《F3: The Open-Source Data File Format for the Future》。作者指出Parquet/ORC等十多年前设计的格式正因硬件与需求演进(存储网络提速、ML场景需存向量/图像/文本、宽表取少列)而逐渐过时,但每引入新编码都要全面升级格式库,跨语言跨平台兼容性使扩展难以落地。F3的核心思路是把解码器以wasm形式内嵌进文件:库程序若有原生解码器就用原生,否则加载文件内wasm执行,wasm体积仅数KB级别、性能约为原生的70%~90%。F3还解耦Row Group、编码最小单元与物理IO单元的绑定,并用FlatBuffers序列化列级元数据以降低宽表取少列的反序列化开销。文章明确指出随文件分发程序带来安全风险,论文把中心化验证留作未来工作,并补充了更早的同类工作AnyBlox(VLDB 2025最佳论文)。

推荐收录。文章准确提炼了F3要解决的格式扩展兼容性痛点、内嵌wasm解码器的机制与性能取舍,并客观指出安全验证缺口,还延伸到AnyBlox、Lance、Bullion等同类工作,形成可追踪的学术脉络。适合关注数据库存储格式、数据湖与ML数据基础设施的读者,用来理解文件格式演进方向及“解码器随文件分发”这一可迁移设计思路;不足是未深入实验数据与安全方案的可行性论证。

技术文章TiDB 社区博客 - 技术解读

一文了解平凯数据库的容灾能力:集群内高可用、集群级容灾、历史数据恢复

文章系统介绍平凯数据库的三层容灾体系。第一层是集群内多副本高可用:数据分片在 TiKV 多副本、经 Raft 多数派写入,可容忍节点、磁盘和局部网络故障,但保护边界限于单集群和单机房。第二层是物理复制,在生产与灾备集群之间建立独立集群级复制,支持跨机房/地域接管,并区别于逻辑复制。第三层是 BR 与 PITR,用于误删、数据污染和勒索后的历史时间点恢复。文章强调三者互补而非替代,但没有给出 RPO/RTO、性能开销和具体运维步骤,偏产品能力概述。

推荐收录,因为它清晰划分集群内高可用、集群级物理复制与 BR/PITR 历史恢复的故障边界,能帮助数据库架构师判断多副本不等于灾难恢复,并理解跨机房容灾与数据回滚的不同目标。主要风险是产品视角较强,缺少 RPO/RTO、性能开销和演练细节,适合作为容灾体系设计的概念框架而非实施手册。

工程实践TiDB 社区博客 - 实践案例

山东政务协同、聊城烟草与企业知识库背后:五类场景共用一套 TiDB 底座

文章整理山东腾安信息的 TiDB 实践:政务协同、烟草数据中台、企业知识库、异构迁移和数据库安全五类场景共用一套数据库底座。做法包括将 12 套政务系统收敛为两个隔离集群,用 RU 配额与优先级做多租户调度;烟草中台以 TiKV 行存和 TiFlash 列存同时支撑交易与分析;知识库把 SQL 权限过滤与 HNSW 向量检索结合在同一份数据上。迁移侧用 TiDTS 编排全量与增量同步,安全侧用 DBNginx 将连接入口变为访问治理入口,结论是共性数据能力应下沉为可调度、可分析、可迁移和可治理的基础设施。不足是文章为厂商实践分享,缺少性能、成本、故障和量化收益对比,方案有效性需结合自身规模验证。

推荐收录。文章给出了多系统收敛为两个集群、HTAP 行存列存协同、SQL 权限过滤与 HNSW 向量检索结合、TiDTS 迁移编排和 DBNginx 访问治理等具体证据,适合数据库平台、数据中台和安全治理工程师参考。其可迁移价值在于把重复建设问题拆成资源调度、分析、检索、迁移与安全等可治理能力;风险是厂商视角明显,缺少量化收益与失败边界,选型时仍需独立验证。

技术文章TiDB 社区博客 - 技术解读

TiDB 向量搜索与 AI 集成

文章系统介绍 TiDB 的向量搜索能力与 AI 集成实践:先说明向量搜索与 Embedding 的基本原理,再讲解 TiDB 原生 VECTOR 数据类型、向量写入方式、VEC_COSINE_DISTANCE/VEC_L2_DISTANCE 等距离函数,以及 HNSW 向量索引的参数含义。随后给出构建 RAG 知识库问答的完整架构与 Python 代码,演示与 OpenAI Embedding、LangChain、LlamaIndex 的集成思路,并讨论索引构建时机、HNSW_EF_SEARCH 调参和向量维度取舍等性能优化要点。核心结论是 TiDB 可在同一条 SQL 中结合向量检索与结构化过滤,避免维护两套系统。不足在于部分代码为占位或有误(如框架集成示例将查询向量写成空数组),且向量索引依赖 TiFlash,社区版暂不支持 SQL 建索引,整体偏入门教程。

收录理由是文章把 TiDB 原生 VECTOR 类型、HNSW 索引与“向量+结构化条件”混合搜索放在同一 SQL 中讲解,并配有 RAG 知识库与 LangChain/LlamaIndex 集成示例,对希望在现有关系库上落地向量检索的开发者有可迁移价值。需注意部分示例代码为占位或含错误、索引依赖 TiFlash,读者应结合官方文档验证后再用于生产环境。

技术文章TiDB 社区博客 - 技术解读

TiDB 的 Region:不是书架格子,而是一段会“分裂、搬家、合并”的图书编号区间

文章以图书馆编号区间为比喻,纠正“Region 是固定物理格子”的常见误解,指出它是 Key 空间中的连续区间及对应 Raft 副本状态。作者分层解释 Region、Peer、Raft Group、PD 与 RegionCache 的关系,并说明 Split、Merge、副本迁移如何改变逻辑边界和副本分布。文中还串联 RegionEpoch、EpochNotMatch/NotLeader 处理,以及 SQL 请求经 TiDB、RegionCache、Leader Peer 到 RocksDB 的定位路径。核心结论是逻辑分片与物理存储、复制和调度解耦,从而支撑弹性扩展、高可用与负载均衡。边界在于作者声明为个人学习解读,未展开源码、实验和版本差异,阈值与具体机制仍依赖 TiDB/TiKV 配置。

推荐收录:文章用清晰比喻和分层结构,把 Region、Peer、Raft、PD、RegionEpoch 及请求路由串成完整认知链路,并明确 Split/Merge/迁移的边界,能帮助 TiDB/TiKV 初学者和分布式数据库开发者建立正确心智模型。它不是产品发布或泛泛教程,核心概念和排障思路可迁移到分布式分片系统,但读者需注意其个人解读属性,具体阈值应回到官方文档与版本源码验证。

技术文章DuckDB Engineering Blog

Persistent Databases in the Browser with DuckDB-Wasm and OPFS

文章介绍 DuckDB-Wasm 如何借助浏览器 Origin Private File System(OPFS)实现持久化数据库:通过 open({path: 'opfs://analytics.duckdb'}) 打开数据库文件,数据以标准 .duckdb 文件加 WAL 的形式落盘,可跨页面刷新和浏览器重启存活,无需 IndexedDB 封装或应用层序列化。文中给出完整代码示例,说明远程 Parquet 数据只在首次加载时通过 HTTP range 请求获取,之后由 OPFS 提供;并对比了 auto 与手动 registerOPFSFileName 两种文件处理模式在便利性和句柄开销上的取舍。持久性部分指出浏览器标签页很少被干净关闭,因此应在每批写入后显式执行 CHECKPOINT,或将 checkpoint_threshold 设为 0,否则 WAL 重放会拖慢下次打开。文章还提醒 OPFS 属于可能被浏览器回收的存储,应定位为本地缓存而非唯一数据副本,并演示了通过 OPFS API 或 COPY 到 Parquet 导出数据;同时给出仅支持单句柄、SQL 重命名受限、npm latest 版本存在路径规范化 bug 等边界。

推荐收录:这是 DuckDB 官方对浏览器内持久化数据库的机制级说明,包含可运行代码、WAL 与 checkpoint 的持久性权衡、文件句柄与版本兼容等真实约束,证据具体而非概念宣传。适合做 local-first Web 应用、浏览器端分析或 Wasm 存储选型的开发者,其中的检查点策略、缓存与真实数据源分层、导出路径等判断可直接迁移到类似离线优先系统。主要风险是 API 与版本行为仍在演进,读者需核对所固定版本与官方限制说明。

工程实践PlanetScale Blog

The architecture of Neki

本文从底层拆解 Neki 的分片架构:它不 fork Postgres,而是在原生 Postgres 实例上扩展,用 PostgresManager 管理实例、Sidecar 连接池,并将主从副本组成 shard。Admin 处理故障检测、切换和持久性策略,Operator 在 Kubernetes 上编排生命周期;Router 对客户端提供单一 wire-protocol 入口,基于权威 shard catalog 解析并规划分片查询,必要时做跨分片 join/聚合。etcd 保存 Data Topology,Replicator 支撑 MoveTables、Reshard 和 OnlineDDL,并通过 Router 缓冲完成 cutover。文章适合理解分布式数据库控制面与数据面设计,但作为厂商架构概览,缺少性能基准、故障边界和成本权衡。

推荐收录:文章把 Neki 的数据库控制面与数据面逐层拆成 PostgresManager、Sidecar、Shard、Admin、Operator、Router、Data Topology 和 Replicator,并说明 OID 一致性、连接池分类、跨分片 join、etcd 拓扑和 cutover 缓冲等具体机制。适合分布式数据库、基础设施和 Kubernetes 平台工程师参考,可迁移到分片系统设计与在线数据迁移场景;但它是厂商架构概览,尚无性能基准和故障边界验证,需结合后续实测判断。

技术文章pganalyze Blog

Postgres Monitoring for SQL Server DBAs: Statistics and Logs 101

本文面向从 SQL Server 转向 Postgres 的 DBA,系统梳理 Postgres 监控数据的来源与配置方法。作者先用任务对照表指出两者的本质差异:SQL Server 的诊断多为查询时决策,而 Postgres 必须在事件发生前决定是否记录,未写出的日志行事后无法恢复。文章介绍 pg_stat_activity(实时快照而非累计值)、pg_stat_* 累计视图与 pg_stat_statements(聚合查询统计)的定位与读法,并给出具体配置:启用 pg_stat_statements 需改 shared_preload_libraries 并重启、log_directory 要移出 $PGDATA、log_line_prefix 建议含 %m/%p/%q 及用户数据库应用字段、log_min_duration_statement 配合采样、开启 log_lock_waits 与 log_temp_files,以及用 pg_monitor 授予非超级用户监控权限。文中还剖析日志目录权限导致采集代理无法遍历、前缀尾部空格被复制丢失等常见陷阱,并辩证对比 Query Store、Extended Events 与 auto_explain 的取舍。结论是 Postgres 记录内容高度可配置但默认保守,需提前规划才能支撑事后排障。

推荐收录。文章给出了可直接落地的配置项(pg_stat_statements、log_line_prefix、log_min_duration_statement、pg_monitor 授权)和一张按问题定位数据源的对照表,并解释了 Postgres 与 SQL Server 在“记录时机”上的本质差异及 $PGDATA 权限等真实踩坑点。适合从 SQL Server 迁移或负责 Postgres 监控的 DBA、SRE 与后端工程师;需注意其出自监控厂商,部分建议带有工具倾向。

工程实践TiDB 社区博客 - 实践案例

【最佳升级实践指南】得物TiDB升级实践

文章复盘得物将自建 TiDB 从 v5.3.3 迁移升级到 v7.5.x 的实践。背景是低版本停止维护、TiCDC 同步有延迟/OOM 风险、备份超 8 小时且负载上升,并偶发慢查询和可用性 BUG。团队采用迁移升级而非原地升级,经集群调研、环境准备、升级前验证、流量迁移和旧集群销毁,兼顾灰度与回滚。升级中遇到 v7.5.x 优化器对大表倾向全表扫描、聚合计划不准,通过绑定索引或设置 tidb_opt_objective=determinate 缓解。收益包括应用平均 RT 提升 44.62%、TiCDC 同步与备份效率提升、存储压缩至 MySQL 三副本约 55%,并总结 TiDB 适用于非分片查询、分析 SQL、磁盘瓶颈和数据倾斜场景。

推荐收录,因为它完整展示了一次大规模分布式数据库版本迁移的决策链路:为何放弃原地升级、如何用 TiCDC 做灰度迁移,以及优化器回归(全表扫描、执行计划不准)的定位与缓解。对 DBA、SRE 和数据库平台工程师,文中 RT、备份、TiCDC、存储压缩等量化收益及 TiDB 与 MySQL 的选型边界可迁移;但部分升级步骤仅有标题,落地需结合自身集群验证。

工程实践TiDB 社区博客 - 实践案例

【升级指南】 大版本升级指导

文章是 TiDB 大版本升级的操作指南,按升级前置、原地升级和迁移升级三个阶段组织。前置阶段列出 variables/config 比对、应用兼容性回归、集群巡检、Patch 检查、性能压测、升级时长与 DDL 窗口评估、软件包准备和备份清单等检查项。原地升级给出屏蔽告警、按最佳实践调整 config、tiup cluster upgrade、监控 QPS/P99 与 PD Leader、核对版本和调整 variables 等步骤。迁移升级则通过 CDC 搭建备库、VIP 切换、sync_diff_inspector 校验、反向同步来支持回退。整体偏流程清单,缺少真实案例、失败复盘和版本差异细节,需结合官方 Release Notes 与自身环境验证。

推荐收录:文章给出 TiDB 大版本升级的完整检查项与操作步骤,包括升级前变量/参数比对、兼容性回归、压测、备份清单,以及原地升级和 CDC 迁移升级加反向同步的回退路径,并列出具体 tiup 命令与监控指标。对 TiDB DBA/SRE 做升级窗口评估和风险控制有直接参考价值。但内容偏流程清单,缺少实际案例与版本差异分析,使用时需结合官方 Release Notes 和环境验证。

工程实践TiDB 社区博客 - 实践案例

【升级指南】TiDB 集群升级标准操作步骤,从v6.5升级到 v8.5.x

本文给出 TiDB 集群从 v6.5.12 升级到 v8.5.x(示例目标版本为 v7.1.8-5.2)的标准操作步骤,覆盖前置评估、原地升级和迁移升级三类流程。前置阶段通过脚本对比升级前后系统变量、TiDB/TiKV/PD 配置差异,并包含巡检、patch 检查、压测、窗口与 DDL 评估、安装包准备,以及系统变量、权限、sequence、view、core variables、meta.yaml 等备份脚本。原地升级使用 tiup cluster upgrade,随后检查 QPS/P99、PD Leader、版本与 git_hash,并按最佳实践微调 config 和 variables。迁移升级给出 BR 全量恢复、TiCDC 同步、sync_diff_inspector 一致性校验、应用切流和反向同步,以及异常时回退流程。文章偏运维 runbook,命令和脚本可复用,但版本号示例与目标不完全一致,部分步骤仅有文字或无截图,需结合实际环境验证。

推荐收录,因为它提供了可执行证据:变量/配置 diff 脚本、完整备份脚本、tiup 原地升级命令、BR+TiCDC 迁移与 sync_diff_inspector 校验、回退步骤,而不是泛泛介绍升级流程。适合 TiDB DBA、SRE 和负责数据库变更的工程团队在制定升级窗口、备份、校验与回滚预案时参考。主要风险是示例版本为 v7.1.8-5.2、部分环境信息被脱敏,且少数步骤缺少截图和验证数据,落地前需在测试环境验证。

工程实践TigerBeetle Blog

High-Throughput OLTP in Three Simple Steps

文章以经典银行存取款 OLTP 负载为例,说明从通用 SQL 数据库迁移到 TigerBeetle 时,逐行照搬模型会严重损失性能。核心建议有三条:用双式记账转账和聚合账户替代多行更新与历史表;利用客户端自动批处理合并请求(最多 8189 条操作);用近似单调递增的 TBID 替代随机 UUID 以加速幂等检查。文中称单客户端大 batch 可达约 45.4 万事务/秒(90.9 万转账/秒),而关系数据库存储过程约 7000 事务/秒,差距来自避免行锁、批处理与服务端并行 I/O。作者也说明对比仅为数量级参考,且方案依赖应用与数据库协同设计。

推荐收录。文章不是泛泛介绍产品,而是给出可验证的数据建模、自动批处理和单调 ID 三条具体优化手段,并用约 45 万 TPS 对比 7 千 TPS 说明高竞争 OLTP 的架构差异;适合后端、数据库和系统设计读者理解批处理、幂等键与应用/数据库协同设计。需注意基准来自厂商且调优经验不对等,但技术取舍和性能分析仍可迁移。

技术文章pganalyze Blog

Postgres in Production Special Series: How to Query pg_stat_statements to Find Slow and Expensive Postgres Queries (Part 7)

本文是 pg_stat_statements 深入系列第七篇,讲解生产事故中如何查询该视图定位慢查询和高开销查询。作者指出 pg_stat_statements 只记录已完成语句且指标累计、没有时间线,因此应先查 pg_stat_activity 判断是否存在正在运行的长事务。获取时间窗口可用两种方法:隔时取两个临时表快照做差值,或在可重复负载下 reset 后重新查询,并用 pg_stat_statements_info 查看重置时间。排序不应只看 total_exec_time,还可按 calls、mean_exec_time、temp_blks_written 等发现高频、均值慢或写临时文件的查询。文章给出 SQL 示例和演示,并提醒最慢查询未必最值得优化;选择监控工具时要关注完整查询文本、采样频率、重置恢复和多工具锁竞争。其内容偏 PostgreSQL 监控实践,不展开执行计划内部原因。

推荐收录。文章给出可直接执行的 SQL 诊断流程,覆盖 pg_stat_activity 优先检查、快照差值/reset 两种时间窗口、多列排序指标和监控工具选型要点,证据具体且可迁移到生产 PostgreSQL 性能排查。适合 DBA、SRE 和后端工程师;需注意作者来自 pganalyze,工具选型部分有厂商视角,但核心方法仍具长期参考价值。

工程实践Oxide Public RFDs

RFD 0508: Whither CockroachDB?

本文是 Oxide 的 RFD 决策记录,讨论 CockroachDB 从 BSL 1.1 转为严格专有/源码可见许可后,控制平面数据库的选型去留。作者先回顾选用 CockroachDB 的原因:空间和性能要求不高,但持久性、可用性与免运维至关重要;随后逐项评估替换数据库、购买企业版、接受免费源码可见版、停留在 Apache 2.0 的 22.x 等方案。最终决定继续自支持 CockroachDB 22.1/22.2,不升级到 22.2 之后,并将内部补丁整理为 Oxide 自有仓库维护。其边界是 Oxide 将数据库嵌入出货硬件、运行于 illumos 衍生系统且本就准备自支持;代价是长期停留在旧版本并自行承担维护与安全风险,不能直接照搬为通用数据库选型建议。

推荐收录:文中给出了因上游许可证变更而重新评估数据库依赖的完整决策链,包括 BSL、CCL、强制遥测、按核年费、Apache 转换时间表和自支持成本等具体约束。适合基础设施、数据库选型、开源合规和平台工程读者参考,可迁移到评估关键基础软件供应链风险与版本冻结策略;但需注意其结论高度依赖 Oxide 的嵌入式出货场景,不构成通用选型建议。

技术文章Oxide Public RFDs

RFD 0463: The Oximeter Query Language

本文是 Oxide 的 RFD 463,描述用于查询和加工机架遥测数据的领域特定语言 OxQL。oximeter 采集硬件与软件指标并存入 ClickHouse,OxQL 以表、时间序列、字段和数据点为核心模型,支持 gauge、cumulative counter、delta 与 histogram,并在读取 cumulative 数据时自动转为 delta,以便对齐、聚合和连接。语言采用 Unix 管道式表操作(get、filter、align、group_by、join)和子查询,配合字面量、比较/逻辑运算符及 EBNF 语法定义。文档强调自研 DSL 的理由:现有 SQL 和各类指标查询语言不适配时序数据且集成成本高。其边界是目前不支持 raw cumulative 选择和 outer join,且作为发布后不再更新的规范,主要面向 Oxide 内部与用户文档。

推荐收录。该 RFD 不是新闻或营销稿,而是完整给出了 OxQL 的设计动机、数据模型、语法定义、示例和查询语义,包含 cumulative 到 delta 的自动转换、对齐/分组/连接等可迁移概念。适合做可观测性、时序数据库、DSL 或后端查询系统的读者参考。注意其内容与 Oxide 机架和 ClickHouse 强绑定,且 RFD 声明发布后不再更新,迁移时需结合具体数据模型取舍。

工程实践Oxide Public RFDs

RFD 0469: Stopgap CockroachDB Updates

RFD 469 讨论 Oxide 控制面仍运行已停止上游支持的 CockroachDB v22.1,而 CockroachDB 仅支持逐个大版本升级且默认自动 finalize、无法降级,因此提出短期过渡方案。作者在 v8 控制面引入 cluster.preserve_downgrade_option,并采用 Tick-Tock 模型:Tick 将 cockroachdb zone 升级到下个大版本,并在长期测试环境验证降级可用;Tock 重置并重新保留降级选项。按计划从 v22.1 逐版本推进到 v23.2,分别落在控制面 v8 至 v14,每个大版本跨两个发布完成验证与收尾。实现上要求不给 Mupdate 增加额外手工步骤,也不编写 Nexus 自动化后会丢弃的新代码。开放问题是 Tick 与 Tock 之间能否升级补丁版本,仍需测试;该方案是过渡性运维设计,不替代最终自动更新工作流。

推荐收录,因为它给出了数据库大版本升级的真实约束与可复现操作模型:用 preserve_downgrade_option 保留回退路径,用 Tick-Tock 跨控制面版本逐步验证和 finalize,并明确排期、实现约束与开放问题。对负责数据库、控制面或平台升级的 SRE/工程读者,这套分阶段升级与回滚设计可直接迁移;但内容高度依赖 Oxide 内部发布流程,缺少故障演练结果和性能数据,阅读时需结合自身环境验证。

工程实践Oxide Public RFDs

RFD 0289: Steno Upgrade

本文是 Oxide 的公开 RFD,讨论分布式 saga 框架 Steno 的升级问题。Steno 将复杂分布式操作拆解为幂等动作并持久化每个动作的输出,导致软件版本变化时恢复旧 saga 状态非常脆弱。作者提出“同一 saga 仅由同一版本 Nexus 执行”的约束,并通过蓝绿部署排空旧实例以及为 saga 存储版本/签名来实现。文章详细分析了签名设计、升级本身也是 saga 的边界情况、回滚与孤儿 saga 的处理,并对比了显式键值存储、Stripe 式 API 版本化和 WASM 等备选方案。该方案可避免跨版本恢复的复杂性,但代价是存在 bug 的在途 saga 无法被新版本修复,且旧版本可能因等待排空而延长暴露时间;文中尚有许多实现细节待定。

推荐收录,因为该 RFD 针对真实分布式系统的升级难题给出了具体约束、机制设计和多种备选方案对比,并讨论了排空、版本签名、回滚失败与安全暴露等工程取舍。适合设计分布式 saga、持久化工作流或升级系统的工程师阅读,其中的问题拆解和权衡方法可迁移到类似场景。但需注意它只是方向性草案,并非已验证实现,适合作为设计推理参考而非直接落地方案。

工程实践Oxide Public RFDs

RFD 0192: Omicron Database Design

本文是 Oxide Omicron 控制面数据库的设计 RFD,围绕强一致性与可扩展性,给出多租户 API 资源(Project、Instance、VPC 等)的建模与查询模式。作者采用 UUID 主键、身份元数据、按父作用域与 name 的唯一部分索引,支持分页、重命名和软删除,并避免显式外键。文章用条件 UPDATE、CTE、generation number 与 rcgen 处理并发更新和检查-使用竞态,也比较事务、CTE、saga 的适用场景。最后分析读-改-写、长事务、双管理员并发及集合删除/创建竞态,并指出实现尚不完整、方案依赖 CockroachDB SERIALIZABLE 与具体 API 约束。

推荐收录。文章不是泛泛介绍数据库范式,而是给出可核验的表结构、唯一部分索引、条件 UPDATE/CTE、rcgen 和 saga 选择规则,并明确 CockroachDB SERIALIZABLE、软删除与双管理员并发下的边界。适合控制面、分布式数据库和后端架构读者,其中的并发控制与一致性模式可迁移到多租户 API 设计;风险是方案与 Oxide/CockroachDB 强耦合且实现未完成。

工程实践Oxide Public RFDs

RFD 0125: Telemetry requirements and building blocks

本文是 Oxide 发布的 RFD,系统讨论机架遥测系统的需求与技术选型。作者先按用途划分实时/历史、高可用、水平扩展、趋势近似与精确测量等要求,并辨析事件与指标、基数控制、资源可预测性以及采集与存储解耦。随后评估 illumos FMA、Prometheus、Thanos、InfluxDB、ClickHouse、VictoriaMetrics 等候选构件,比较其查询、告警、集群和重聚合能力。针对 ClickHouse 与 VictoriaMetrics 的模拟指标实验显示 ClickHouse 资源使用更可预测,作者初步倾向 ClickHouse,但指出其集群依赖 ZooKeeper。文末实验数据在抓取中截断,部分最终架构判断仍需结合后续 determinations。

推荐收录:文中不仅罗列候选技术,还把遥测需求拆成实时性、HA、水平扩展、精度、趋势等可比较维度,并以 ClickHouse/VictoriaMetrics 实验和 Prometheus、InfluxDB、VM 的具体缺陷作为选型证据。对构建可观测性平台、时序存储或基础设施监控系统的读者尤其有价值,其需求分解、评估表和踩坑记录可直接迁移到类似选型场景。需注意该 RFD 仍在形成最终架构判断,实验数据在抓取中截断,引用时需核对后续版本。

工程实践Oxide Public RFDs

RFD 0161: Metrics data model

Oxide 的 RFD 161 定义了整个机架指标数据的建模方式,并确定在 ClickHouse 时序库中存储与查询这些数据。文章先提出数据模型目标——表达力、可操作性、可扩展性、效率与强类型,并借用 Google Monarch 的术语定义 target、metric、timeseries、field 与 metric type。随后用服务请求延迟、虚拟机 CPU 利用率、磁盘温度三个例子给出 target/metric schema 与 timeseries key 的构造方式,并列举代表性查询。核心内容是两种数据库组织方案的对比:字段展开(元数据表加大量 join)与动态表(按 target-metric 对建表,更少 join 但需管理数千张表)。最终决定采用字段展开模型,并列出 pre-quorum 数据、不同时间尺度字段的存储、日志与分布式追踪未覆盖等开放问题。

这是 Oxide 公开的真实架构决策文档,给出两种时序数据建模方案的具体 schema、示例查询与权衡:join 成本对比建表和 schema 管理复杂度,并指出 ClickHouse 数千表下的性能未知,最终明确选定字段展开方案。对设计指标/可观测性平台、在 ClickHouse 等列存库上建模时序数据的工程师有直接参考价值和可迁移的取舍方法。

工程实践Oxide Public RFDs

RFD 0053: Control plane data storage requirements

该 RFD 界定 Oxide 控制平面持久化数据存储需求:需存储实例、虚拟磁盘、网络资源、服务器、用户/SSH 密钥等对象,支持持久 CRUD、分页一致性枚举和乐观并发控制,并讨论 ACID 是否必需。非功能要求包括强一致、有限故障下可读写、零计划停机、无人值守、可诊断、安全、开源与低成本,且把逻辑复制和在线 schema 迁移列为一等能力。文中估算单机架约万级实例、约 100 GiB 数据,外部 API 延迟需数百毫秒内、数据库访问约 150ms 内,短生命周期负载可达千级 rps;作者据此主张先评估现有系统,并给出从调研、Jepsen 失败分析到部署、故障与长时压测的漏斗式选型方法。候选聚焦 CockroachDB、Yugabyte、TiKV/TiDB、VoltDB 等 NewSQL,排除传统 RDBMS、NoSQL、FoundationDB 与 ZooKeeper/Etcd 类系统;但该文仍是早期需求框架,未给出最终基准和选型结果。

推荐收录。该文不是产品宣传,而是把控制平面数据存储的功能/非功能需求、规模与延迟估算、自研与采购取舍、候选 NewSQL 及排除项、以及分阶段评估方法写得很具体,对设计高可用控制平面、做分布式数据库选型或需要向团队说明存储约束的工程师有直接参考价值。局限是它属于早期 RFD,未给出实测基准和最终选型,读者应把它当作需求清单和评估框架而非结论。

工程实践Oxide Public RFDs

RFD 0110: CockroachDB for the control plane database

本文是 Oxide 的 RFD 110,评估将 CockroachDB 作为控制平面数据库的可行性。作者先说明控制平面对强一致、高可用、水平扩展和低运维的诉求,再介绍 CockroachDB 的 range 分片、Raft 写、leaseholder 读、自动分裂/合并与故障恢复机制,并汇总在线扩缩容、长跑、schema 变更、备份恢复、滚动升级及多种故障注入测试。结果显示 CockroachDB 无数据丢失、故障后无需人工干预即可收敛,但扩缩容和 schema 变更会造成明显尾延迟上升,非企业版备份恢复与许可证也是主要风险。作者结论是 CockroachDB 足够可靠,值得继续推进,同时列出未测试项和后续风险。

推荐收录,因为它不是产品介绍,而是包含明确选型目标、测试设计、故障注入结果和风险清单的工程评估。对负责数据库选型、分布式存储或控制平面可靠性的读者,文中的测试维度、CockroachDB 行为边界以及备份/许可证风险可直接迁移到类似系统设计。注意其结论基于特定版本、AWS 与 illumos 环境,绝对性能结论有限。

工程实践PlanetScale Blog

Introducing TIN: full-text search for Postgres

PlanetScale 发布并 GA 全文搜索扩展 TIN,目标是在事务、复制与并发更新下支持布尔/短语/模糊/正则查询、COUNT(*) 和 BM25 top-k。其核心设计是直接用 Postgres ctid 作为 posting 标识,省去顺序 docid 到 ctid 的映射;再用页面级与偏移级位图压缩 48 位 ctid,并借助 AVX2/AVX-512 向量化交并和 POPCNT 计数。TIN 通过堆检查、可见性映射和 liveness bitmap 保证 MVCC 与 VACUUM 正确性,分段合并时因 ctid 不变可复用位图、降低写放大。基准在 85GB Stack Exchange 语料、8 vCPU/32GB 容器中对比 ParadeDB、pg_textsearch 与 GIN,TIN 吞吐至少高 8 倍。但这是厂商自测且查询轨迹合成,跨工作负载的独立验证和运维边界仍需观察。

推荐收录:文章虽为产品发布,但给出了 TIN 以 ctid 为文档标识、位图压缩与向量化执行、MVCC/VACUUM 集成的完整设计解释,并用可复现的容器配置和对比基准量化性能。适合数据库内核、搜索索引和性能工程读者,其“复用存储引擎原生标识以减少映射和合并开销”的思路可迁移到其他索引系统;风险是厂商自测、合成查询,需结合独立验证。

技术文章SelectDB 技术分享

当 Variant 遇到 Lakehouse:Apache Doris 5.0 Variant 统一解决方案 Apache Doris 5.0 把 Variant 类型从内表扩展到了 Iceberg / Paimon 等开放湖格式,使用同...

文章介绍 Apache Doris 5.0 如何把内表 Variant 类型扩展到 Iceberg / Paimon 等开放湖格式,解决 JSON 半结构化数据在生产端(Flink/Spark 入湖)与消费端(Doris 分析)之间的割裂。作者以 AI Agent 轨迹、埋点和 IoT 遥测为例,说明双写同步带来的冗余存储、同步延迟与不一致,并结合 Parquet Variant 编码、Iceberg V3、Paimon 1.4 等标准化进展,提出上层统一类型与 SQL、中层统一执行算子、下层统一格式访问接口的三层方案,并给出 Agent 观测场景的查询、热数据入内表与结果回写 SQL 示例。文末对比内表与湖上 Variant 的能力并给出选型建议,但 Shredded 写入与读取性能细节留待后续文章,且缺少独立实测数据。

推荐收录:文章完整呈现了从问题(半结构化数据生产者与消费者割裂)到方案(统一类型/SQL、统一算子、统一格式接口)的设计脉络,并梳理 Parquet、Iceberg、Paimon 的 Variant 标准化时间线,对评估湖仓一体与半结构化数据分析的数据库、数据平台工程师有直接参考价值。需注意其来自 Doris 厂商,Shredded 写入与性能实测尚未给出,选型结论宜结合后续技术文章与自测验证。

工程实践Greptime 技术

Building a Unified Observability Platform on GreptimeDB: A Reference Architecture

文章提出在 GreptimeDB 上构建统一可观测性平台的参考架构,将指标、日志和追踪汇入同一数据库,同时保留现有采集器协议。作者以 OpenTelemetry Astronomy Shop 为验证环境,用单个 GreptimeDB 实例替换 Jaeger、OpenSearch 和 Prometheus,详述写入端点、按信号分表、Flow 物化视图、TTL/WAL、查询接口及三档集群拓扑。核心决策包括按信号分表、按量分区、用 Flow 隔离仪表盘告警热路径,并展示基于 trace_id 的跨信号 SQL 关联与延迟自连接分析。边界是 Loki 仅兼容写入、Elasticsearch 开源版仅 _bulk,亚毫秒指标查询弱于 VictoriaMetrics,部分隔离与告警属企业版。验证以单机演示和有限基准为主,生产需按自身负载验证。

推荐收录:文章给出可直接复用的参考架构、写入端点表、表设计、Flow/TTL/WAL 与三档拓扑,并用 OTEL Demo 实际数据展示跨 trace_id 日志关联和延迟自连接,工程证据具体。适合负责可观测性平台、数据库选型和 SRE/平台工程落地的读者。需注意来源为厂商博客且验证以单机演示和厂商基准为主,大规模生产收益应结合自身负载验证。

工程实践Greptime 技术

Building a Unified Observability Platform on GreptimeDB: A Reference Architecture

文章提出用单个 GreptimeDB 统一承载 metrics、logs、traces 的参考架构,并在 OpenTelemetry Astronomy Shop 演示环境中验证。它给出 Prometheus remote write、OTLP、Loki、Elasticsearch _bulk 等写入协议与端点,讨论 Metric Engine、表/分区设计、Flow 物化视图、TTL、WAL 和查询接口的工程取舍。文中用真实 SQL 展示从告警到 trace、日志的跨信号排障及客户端/服务端延迟自连接,并按 standalone、小集群、大集群三档给出拓扑建议。作者也列出迁移路径、开源/企业版边界,并承认亚毫秒热指标查询不如 VictoriaMetrics、Loki/Elasticsearch 读兼容有限。整体偏 GreptimeDB 产品指南,但架构流程与验证数据有可迁移价值。

推荐收录。文章以 OTel Demo 实测数据给出统一观测平台的写入协议、表设计、Flow 热冷路径隔离、TTL/WAL 和规模分层,并用真实 trace_id 串联日志与 span 排障,适合可观测性平台和 SRE 读者迁移参考。主要风险是内容来自 GreptimeDB 厂商,部分性能与 Agent 对比结论带有产品视角,需结合自建基准验证。

工程实践ScyllaDB Engineering

Bringing QUIC to Seastar

文章记录华沙大学学生与 ScyllaDB 合作,将 QUIC 集成进 Seastar(ScyllaDB 依赖的异步 C++ 框架)的工程实践。作者先剖析 TCP 队头阻塞与握手延迟的缺陷,再以无隐藏 I/O、无隐藏线程、符合 IETF 标准等条件筛选候选库,最终选用 sans-I/O 的 ngtcp2 并复用 GnuTLS。核心工作包括用单 actor 驱动协议状态机、把 QUIC 流适配为 connected_socket、实现用户态连接路由,并调和 QUIC 与 Seastar 两套流控。作者对比一对一适配与 QUIC-Aware 两种 RPC 方案,在无损回环与丢包场景给出延迟、吞吐基准:无损时 QUIC 有固定每调用开销,5% 丢包时 QUIC-Aware 保留约 76% 吞吐并反超 TCP。该实现仍是单机单分片、合成负载下的受控成果,尚未成为生产级传输。

推荐收录:文章完整展示了从协议选型、适配层设计到 RPC 改造与丢包基准的工程闭环,包含候选库对比、约束取舍和可复现的性能数据,而非泛泛介绍。适合从事网络协议、数据库内核或高性能异步框架的工程师,其 sans-I/O 状态机桥接与流控协调方法可迁移到类似系统。需注意结论基于单机单分片合成负载,尚未在生产环境验证。

工具笔记ClickHouse Engineering

Loading Parquet data into MySQL with ClickHouse

文章介绍如何借助 clickhouse-local 与 ClickHouse 的 mysql 表函数,把 S3 上的 StackOverflow 投票 Parquet 数据直接写入并在 MySQL 中查询,因为 MySQL 本身没有原生导入 Parquet 的方式。作者用 Docker 启动 MySQL 8.4,下载 ClickHouse 二进制,并通过 ch-config.yaml 定义命名集合 mysql_demo 保存连接凭据。核心步骤包括用 DESCRIBE url() 探查 Parquet schema、在 MySQL 建表,再执行 INSERT INTO FUNCTION mysql(...) SELECT ... FROM url() 导入约 230 万行数据。文章重点区分两种查询方式:在 FROM 中写 ClickHouse 子查询时,ClickHouse 会解析并改写成 MySQL 合法 SQL;而通过 query() 传入字符串则原样下发,因此含 tuple 等 ClickHouse 特有函数会直接报错。作者也说明示例为本地演示环境,凭据以明文参数传入,生产系统应改用环境变量。

推荐收录,因为它给出可复现的完整方法,解决 MySQL 无法原生导入 Parquet 的真实数据搬运问题,并明确划出 mysql 表函数的两条边界:ClickHouse 子查询会被改写为 MySQL SQL,而 query() 字符串原样下发,这一区别容易踩坑。适合做 ETL、跨库迁移或用 clickhouse-local 做临时数据处理的工程师参考,命名集合与批量 INSERT 写法可直接迁移;不足是偏操作步骤,性能与生产安全约束讨论有限。

技术文章ClickHouse Engineering

AI Functions in ClickHouse: Upgrade your SQL to the AI age

本文介绍 ClickHouse 内置的 AI Functions 家族,让 SQL 引擎可直接调用 LLM 或 embedding 提供方,把模型调用变成类似 sum() 的普通函数,核心思路是"把模型搬到数据旁"而非把数据搬到模型。文本函数涵盖 aiClassify、aiExtract、aiGenerate、aiTranslate、aiFilter、aiRedact,向量函数涵盖 aiEmbed 与 aiSimilarity,通过 named collection 配置 OpenAI 兼容端点即可使用。作者用 Hacker News 数据集演示分类、过滤、摘要、翻译以及完整 RAG 循环(写入时嵌入、向量索引、cosineDistance 检索、生成答案)。文中还详述会话级配额设置(输入/输出 token、API 调用数、超限报错或软停),并说明 token 计数依赖 provider 上报 usage、重试计入调用配额、分布式查询在各分片独立计数。最后提醒 prompt injection、非确定性、成本随行数放大及 remote_url_allow_hosts 等上线注意事项。

推荐收录。文章并非纯功能公告,而是给出了 SQL 原生调用 LLM 的完整用法与边界:named collection 配置、库内 RAG 循环步骤、配额设置的精确语义(token 依赖 provider 上报、重试计入配额、软停产生默认值行),以及 prompt injection、非确定性和成本随行数放大的生产风险。适合在数仓内构建 AI 应用或做推理成本治理的工程师参考。

工程实践ClickHouse Engineering

ClickHouse Cloud vs. Snowflake: What drives the real-time performance-per-dollar gap

文章是 ClickHouse 团队 CostBench 的第二部分,对比 ClickHouse Cloud 与 Snowflake 在持续实时写入下的性能/成本差异。测试向两套系统灌入相同的 1132 亿行行情数据,速率约 100 万行/秒,并执行相同聚合与下钻查询,读侧资源尽量匹配到约 16 CPU。核心机制差异是 ClickHouse 在写入路径内完成排序和增量物化视图更新,Snowflake 的 Snowpipe Streaming 与异步 MV 刷新分离,MV 平均滞后约 1.4 分钟,聚合查询需在编译阶段补偿未刷新数据。结论称 ClickHouse 端到端实时性价比高 412 倍、聚合查询快 669 倍;但基准由厂商主导,Snowflake 资源估算和 fallback 成本归因需谨慎看待。

推荐收录,因为它给出了可核验的 CostBench 测试方法、相同负载和资源匹配信息,并具体解释了写入内增量 MV 与异步 MV 刷新导致查询时补偿的机制差异,而不仅是性能口号。适合实时数仓、OLAP 选型、性能成本评估方向的工程读者参考;但结论来自 ClickHouse 主导的对比,Snowflake 侧 CPU、fallback 和成本归因为估算,外推时需保留厂商立场风险。

工程实践ClickHouse Engineering

Measuring real-time performance per dollar under continuous load: CostBench’s first end-to-end results

本文介绍 CostBench 首轮端到端评测,聚焦持续负载下每美元实时性能。作者先界定查询就绪数据的三项准备(列式存储、排序与分块裁剪、预聚合),再提出新数据路径概念:在持续摄入数据的同时维护事件级物理布局与预聚合,让查询引擎读得更少、算得更少。评测用同一客户端按每秒约百万行的目标速率推送 1132 亿行 NBBO 股票行情,对比 ClickHouse Cloud、Snowflake、BigQuery 与 Redshift Serverless,统一 schema、排序键、查询集与调度,并把新数据路径成本、归一化查询服务成本和累计查询运行时合成一个越低越优的评分。结论是 ClickHouse Cloud 三项均最低,端到端性能每美元领先 412 至 1996 倍,仅查询侧差距为 32 至 101 倍。边界在于这是厂商自测,排除了存储成本,只覆盖推送式摄入,也未测试 Databricks。

推荐收录:文章公开了共享压测客户端、资源对齐策略、计费归一化公式与开源复现仓库,并给出查询就绪与新数据路径两个可迁移的分析框架,适合做实时分析系统设计和数据仓库选型的工程师参考。主要风险是厂商自测、结论明显偏向自家产品,且排除存储成本与拉取式摄入,建议结合后续逐家分析或独立评测交叉验证。

工程实践QuestDB Engineering

Read DuckLake and QuestDB: the same Parquet, a different table format

文章对比两种开放表格式在元数据存放位置上的根本差异:Iceberg 把元数据写成对象存储中的 metadata JSON、manifest list 和 Avro manifest 文件,目录只保存指向当前元数据文件的指针;DuckLake 则把全部元数据(文件列表、schema 历史、快照、统计信息)存放在 SQLite、Postgres 或 DuckDB 这类 SQL 数据库中,目录即元数据本身。作者由此推导出三点后果:查询规划退化为对索引表的 SQL 查询、不存在元数据小文件堆积因而无需 compaction、但读取方必须能连接该数据库导致生态覆盖较窄。文章随后给出把 QuestDB 冷存储的 Hive 分区 Parquet 通过 ducklake_add_data_files 零拷贝注册进 DuckLake 的具体脚本,并讨论增量同步、删除单文件时需重新注册存活集合、关闭 auto_compact 保护原始文件,以及纳秒时间戳在 DuckDB 视图中降为微秒的边界。

推荐收录。文章不是产品宣传,而是把“表格式即 Parquet 之上的元数据层”这一抽象讲清楚,并用 Iceberg 与 DuckLake 元数据存放位置的差异推导出查询规划、运维成本和生态覆盖上的具体取舍。附带的注册与同步脚本、零拷贝约束和版本相关注意事项,对做数据湖、冷存储分层或 lakehouse 选型的工程师有直接可迁移价值;需注意示例仓库明确非生产工具,且结论带有 QuestDB 自身存储的视角。

工程实践ClickHouse Engineering

Introducing WalShadow: Sub-second Postgres replication to ClickHouse from physical WAL

ClickHouse 发布开源引擎 WalShadow,直接消费 Postgres 物理 WAL 将数据复制到 ClickHouse,绕开逻辑复制槽与逻辑解码插件。其架构分四阶段:在影子 Postgres 实例中回放 catalog WAL 以维护实时 schema,并行解码堆记录,按表批量组装成 ClickHouse 原生 block,再由独立插入池并发写入。为在并行乱序下保持正确性,每行携带源 WAL 位置 _lsn,schema 变更与 truncate 等操作设置屏障等待前序数据落盘。官方基准(同区域 c8i.2xlarge)给出提交到可见延迟约 200ms、吞吐 28.9 万行/秒,对比 PeerDB 的约 10 秒与 12 万行/秒,并支持加列、改列名、删列、建表等 schema 演进。文章属产品发布稿,性能数据来自单表受限场景,未深入讨论失败模式与运维成本。

收录理由在于它给出了可迁移的 CDC 设计证据:物理 WAL 替代逻辑解码的四阶段流水线、用 _lsn 加屏障解决并行乱序正确性,以及带方法说明的延迟/吞吐基准(约 200ms、28.9 万行/秒 vs PeerDB 约 10s、12 万行/秒)。适合正在设计 Postgres→OLAP 实时同步链路的数据与平台工程师参考。需注意其厂商产品发布属性、单表基准的局限,以及托管版仍处私有预览,落地前应自行验证 schema 变更与故障恢复路径。

工程实践TiDB 社区博客 - 实践案例

从 MySQL 性能拐点,到交易、分析与运维一体化的新底座,青岛市外贸赋能中心的TiDB渐进式升级

文章介绍了青岛市外贸赋能中心从 MySQL 渐进式迁移到 TiDB 的完整实践。背景是业务规模和数据量持续增长,MySQL 5.6 主从架构在部分大表接近或突破 2000 万行后出现索引、分页、聚合成本上升,单机扩展受限,且分析负载与在线交易相互干扰。团队评估了分库分表等方案,认为其只是转移复杂度,最终基于 MySQL 兼容性、分布式弹性扩展、HTAP 能力以及运维工具链选择 TiDB。迁移没有一次性推倒重来,而是先从物流系统和金融平台两套核心系统开始,保留 MySQL 处理小规模业务。实际效果包括 DDL 从十几分钟缩短到秒级,复杂 SQL 从十几秒降至秒级甚至毫秒级,数据链路从分钟级缩短到秒级、人工干预率降低 90% 以上。文章也明确了边界:并非所有业务都适合分布式数据库,数据量长期稳定、低并发的小系统仍应使用单机 MySQL。

这是一个真实数据库选型与渐进式迁移案例,完整展示了从性能拐点识别、候选方案比较、迁移策略设计到效果验证和适用边界的全过程,不是单点技术技巧堆砌。适合数据库架构师、数据基础设施负责人和需要向分布式架构演进的团队参考,其中的分阶段换道、场景取舍与成本评估方法可直接迁移到类似系统。

工程实践ClickHouse Engineering

How MCP Toolbox turns agent text into ClickHouse vectors

文章介绍 Google 开源的 MCP Toolbox for Databases 如何与 ClickHouse 集成,把智能体输入的自然语言在服务端转换为向量并做语义检索。核心机制是在 YAML 中声明 Gemini 嵌入模型,并用 embeddedBy / valueFromParam 让工具参数自动嵌入文本,再以 []float32 绑定 SQL 占位符,配合 Array(Float32)、cosineDistance 和 HNSW 索引返回排序结果。作者以 57 篇跨五个主题的文档实测,验证效果并量化嵌入列压缩率低、小数据量下 HNSW 索引收益有限等开销。生产注意事项包括离线批量嵌入、为搜索设置距离阈值、参数由驱动转义而非服务端绑定,以及仅支持 Gemini、taskType 硬编码为 SEMANTIC_SIMILARITY、REST 接口需显式开启等限制。

推荐收录,因为它提供了可复现的端到端配置、57 篇文档实测、查询日志与压缩/索引开销分析,而不只是产品介绍。适合 AI 工程、数据库和 Agent 开发者理解 MCP 工具层如何把 ClickHouse 文本表变成语义搜索工具。主要风险是内容绑定 Toolbox 1.9.0、Gemini 唯一嵌入供应商且检索任务类型不可调。

工程实践ClickHouse Engineering

Build a real-time market data app with ClickHouse and Massive

文章以构建实时行情 tick 应用为主线,展示如何用 Massive(原 Polygon.io)WebSocket 订阅股票 trades 与 quotes,并用 ClickHouse 存储、Node.js/React 后端与可视化。作者给出 quotes/trades 表结构,以 sym 和一分钟时间桶设计 MergeTree 排序键,比较同步与异步插入后采用客户端批量同步写入。查询端用 argMax/argMin 结合时间戳与序列号生成实时行情表,并按两分钟窗口聚合 OHLCV;还演示 AggregatingMergeTree 物化视图预计算 1 分钟 OHLCV、摄入延迟监控与扩展建议。不足是示例缺少持久缓冲、重放、去重和鉴权,也不处理取消/更正或官方 OHLCV 重建,生产化需补齐可靠性设计。

推荐收录。文章提供了可运行的完整示例和关键设计细节:从 WebSocket 订阅、表结构与排序键、同步/异步插入取舍,到实时行情与 K 线查询、物化视图和延迟监控,均有代码与边界说明,适合构建实时分析、行情数据或 OLAP 摄取管道的工程师参考。其模式可迁移到其他高频事件流场景,但需注意示例本身不是生产级方案,缺少鉴权、持久缓冲和重放去重等能力。

技术文章TiDB 社区博客 - 技术解读

用“多人团购”理解Percolator协议

本文以“公司多人团购”作为主线隐喻,系统讲解 Google Percolator 分布式事务协议及其在 TiDB 事务实现中的应用。作者从 Prewrite 阶段写入 Data + Lock 但尚未写入 Write Record 的可见性原理入手,对照 default/lock/write 三个列族解释数据状态。随后逐步说明 Primary Lock 的意义,指明故障恢复时只需检查 Primary 是否已提交:已提交则 roll-forward,未提交则 rollback,并提到 TTL 等待逻辑。文章还覆盖 TSO 时间戳排序、MVCC 快照隔离,以及 Commit 阶段对 Lock 冲突和 commit_ts > start_ts 写冲突的检查。最后介绍 Observer 的异步通知和消息折叠优化,强调 Percolator 是在 Bigtable 不支持跨行事务的前提下,把 MVCC、2PC、Primary Lock 与 Observer 组合起来,从而支持 ACID 事务和增量计算。文中也清楚指出 Observer 通知并不具备事务性强一致性,这是重要的适用边界。

推荐收录。它不是浅层概念科普,而是把 Percolator 中最容易混淆的 Prewrite 可见性、Primary Lock 恢复判定、Commit 冲突检查以及 Observer 的局限逐一展开说明,能帮助读者快速建立准确的心智模型。适合数据库内核、分布式事务相关工程师和学习者在阅读原始论文或 TiDB 事务文档前使用。通俗类比简化了延迟、容错和真实锁细节,但主线机制可靠,具有长期参考价值。

技术文章TiDB 社区博客 - 技术解读

为什么 TiKV 要把事务数据拆成三个"抽屉"?

文章从 TiDB 培训中的 Column Family 概念困惑出发,梳理了 Column Family 在 Bigtable、HBase 和 TiKV/RocksDB 中的角色演变。作者指出 Bigtable 引入 CF 是为了逻辑分组、资源管理和数据局部性;HBase 将其作为用户可见的数据建模单元;而 TiKV 则借助 RocksDB 的 CF 机制承载 Percolator 事务模型中的 data、lock、write 三类逻辑数据。文章结合源码解释了一个 RocksDB CF 基本等同于一棵独立 LSM Tree,拥有自己的 MemTable、SST 和 Compaction 状态,因此 TiKV 拆三个 CF 是为了让生命周期和访问模式不同的数据互不干扰,降低写入放大、避免大 Value 挤占缓存。文章还澄清拆分发生在事务存储层而非用户表层,并说明隔离仅限于 LSM Tree 层,各 CF 仍共享 WAL 和线程池。整体属于对 TiKV 事务存储设计原理的深入解读,但主要基于公开论文、源码和个人理解,未涉及运行时实测对比。

推荐收录。文章不是产品介绍,而是从 Bigtable/Percolator 论文到 RocksDB 源码的完整技术考证,把 TiKV 三个 Column Family 的隔离动机解释得很清楚。适合数据库内核、分布式系统和存储引擎方向的工程师与研究者阅读,也可以作为理解 LSM Tree 与事务存储结合的参考材料。其可迁移价值在于展示了从逻辑数据分类到物理存储隔离的工程取舍思路,但结论来自代码阅读与公开资料,缺少实测数据,阅读时需注意这一点。

技术文章TiDB 社区博客 - 技术解读

看懂 TiDB 向量索引(上篇·技术背景)

文章系统讲解向量检索的技术背景:从 Embedding 将对象映射为高维空间中的点入手,说明余弦、内积等相似度度量,并指出全量暴搜 KNN 的成本是 O(N·D),难以扩展到亿级数据。随后引入 ANN 与召回率指标,提出在近似索引中以可控精度损失换取数量级提速。作者分别剖析了 IVF 聚类倒排索引、HNSW 分层图索引和 SPFresh 动态分区索引的原理、查询流程、漏扫原因与核心参数,并从内存占用、更新能力、适用场景做横向对比,强调工程选型需结合数据规模和写入频率。文章逻辑清晰但属背景铺垫,真实工程实现和性能验证留待下篇。

文章不是简单罗列概念,而是用数据库工程师熟悉的“分治/近似”思想拆解向量索引的算法差异,对 IVF、HNSW、SPFresh 的召回率、内存开销和控制参数都有具体分析,能直接帮助读者在选型或阅读架构文档时理解 trade-off。适合后端工程师、数据库研发和需要落地 RAG/向量检索的团队。需留意作者最终落脚于 TiDB 的 SPFresh,属于厂商技术博客,阅读时应结合其他来源交叉验证。

技术文章ClickHouse Engineering

ClickHouse as a streaming HTTP API

文章以英国房价数据集为例,演示如何用 ClickHouse 26.8 新增能力把它本身做成一个流式 HTTP API。核心手段包括 CREATE HANDLER 定义命名端点、在查询串与 URL 路径中传类型化参数({name:Type}、正则路径捕获),以及用 filter、select、sort、order、page、output_format 等设置在改 SQL 的前提下修改结果。作者还介绍了把表直接暴露为路径端点,以及用 framing_output_format(JSONEachPacketString 与 EventStream/SSE)在同一响应中流式传输数据包与进度包,并说明进度包需调小 interactive_delay 才可见。安全部分讲解了处理器按调用者权限执行、用 SQL SECURITY DEFINER 视图只暴露聚合结果而不泄露底表,以及通过 query_log、user_query_log 观测请求。结论是:仅当 API 只暴露受控查询时可省去中间层,若含业务逻辑、编排或应用校验仍需保留应用层,且建表建处理器时只做语法检查、不做语义分析。

推荐收录:文章给出了从建表、建处理器、参数化、结果修改到流式响应、权限控制与日志观测的完整可复现流程,并明确点出何时可以去掉中间 API 层、何时仍需要应用层,边界清晰。适合构建数据库直连数据服务、流式接口或轻量 API 的工程师参考,其中的分帧输出格式、DEFINER 视图授权与结果修改设置可迁移到其他数据服务设计。

技术文章ClickHouse Engineering

Pipelined SQL in ClickHouse 26.8

文章介绍 ClickHouse 26.8 引入的管道式 SQL:用 `|>` 操作符把查询写成一系列显式变换。作者以英国房价数据集为例,对比传统 SELECT 开头、FROM 开头和管道式三种写法,并借助 EXPLAIN SYNTAX 展示管道查询会被翻译成嵌套的标准 SQL,但中间结果不会被物化,整体仍会被优化后执行。文中还说明 EXTEND 可追加计算列、聚合别名能在下一阶段复用从而免写 CTE 或嵌套子查询,并强调阶段顺序会改变语义(如在第二级聚合前插入 LIMIT 会使平均值只基于非确定性的中间子集)。管道语法可用于子查询、视图和 INSERT…SELECT。文章偏教程性质,未提供性能对比或与其他 SQL 方言的深入比较。

推荐收录,文章给出了管道式 SQL 的翻译机制(EXPLAIN SYNTAX 显示为嵌套 SELECT 且不物化中间结果)、EXTEND 与聚合别名复用等可直接套用的写法,并明确指出阶段顺序和非确定性 LIMIT 的陷阱,适合 ClickHouse 使用者与数据工程师快速评估该语法。局限是缺少性能数据与更细的语法边界分析。

工程实践TiDB 社区博客 - 实践案例

TiDB SQL 调优实战:从”跑不动”到”飞起来”的三个真实案例

文章以TiDB生产环境中的三个真实SQL调优案例为主线,展示从“跑不动”到“飞起来”的完整排查过程。第一个案例是因统计信息过期导致优化器误判筛选率,未走联合索引的最优范围,通过ANALYZE和配置自动收集恢复性能;第二个案例是分区表查询因NOW()等非常量表达式导致分区裁剪失效,改写为常量时间后恢复正常;第三个案例是自增主键在聚簇索引下形成写热点,通过AUTO_RANDOM或业务主键加预分裂分散写入。每个案例都给出根因判断、优化SQL和执行计划变化,并总结出先看执行计划、重视统计信息、预防写热点三条方法论,附有诊断命令速查。边界在于案例基于TiDB特定实现,部分结论对传统单机数据库不一定适用。

推荐收录。文章不是零散技巧,而是围绕具体线上问题的诊断链路:现象、根因定位、方案验证和预防措施都写得很清楚,适合TiDB/分布式数据库运维和SQL调优读者。文中关于统计信息、分区裁剪、写入热点的分析方法可迁移到其它分布式或关系型数据库,只是需要结合各自引擎特性试用。

技术文章QuestDB Engineering

Read Parquet and Iceberg: how a table format builds on a file format

文章系统解释 Parquet 文件格式与 Iceberg 表格式的分层关系。先讲 Parquet 的列式布局、统计信息与谓词下推优势,再指出以目录管理多个 Parquet 会在原子提交、并发写、快照、schema 演进和小文件上出问题,而 Iceberg 正是为了解决这些问题。Iceberg 不替代 Parquet,而是在文件之上增加元数据层,通过快照实现原子提交、时间旅行与多引擎互操作,且可直接注册已有 Parquet 而无需重写。文章以 QuestDB 冷存储为例,展示将历史分区转为 Parquet 放入对象存储、再用 PyIceberg 的 add_files 注册为 Iceberg 表的流程,并说明分区同步、纳秒时间戳和 UUID 兼容等运维边界。作者明确演示脚本是 demo,生产需自建带认证目录。

本文清晰区分了文件格式与表格式的职责边界,并用 QuestDB 冷存储配合 Iceberg 注册的完整示例证明 Parquet 可以无需重写即被 Iceberg 采用,概念解释与工程实践并重,属于长期可参考的数据工程内容。适合数据平台工程师、数据架构师及希望理解 Lakehouse 底层原理的读者。文中也提醒了分区同步和类型映射等落地风险,但厂商背景和 demo 代码需结合生产环境谨慎对待。

工程实践TiDB 社区博客 - 实践案例

从 MySQL 到 MongoDB 再到 TiDB:古珀医疗数据库演进与实践

本文基于古珀医疗在区域医疗健康平台建设中的实践,复盘其数据库架构从 MySQL 到 MongoDB、再到 TiDB 的演进历程。早期单体医院项目数据量小,MySQL 可支撑业务快速上线;当业务扩展到区域级和省级平台后,数据规模增长至数十TB,MySQL 在 DDL 变更、写入容量和运维成本上出现瓶颈。MongoDB 的文档模型提升了迭代灵活性,但复杂关联查询和空间成本限制了其适用性;Doris、ADB 等分析型数据库性能好,却因私有化部署和数据同步链路复杂而未采用。最终选 TiDB 主要看中其水平扩展、HTAP、MySQL 兼容和 TiCDC 实时同步能力,并在区域医疗健康大脑、智慧法医等四个核心场景规模落地,最大单集群 80TB。文章也说明没有绝对完美的数据库,需根据场景组合使用多种存储技术。

推荐收录,因为它呈现了真实业务约束下的数据库选型与切换过程,给出了从数百GB到80TB数据规模时的取舍依据和多个核心场景的落地形态。适合在医疗/政务等私有化部署环境下做数据架构选型、或评估分布式数据库替代 MySQL 的读者参考。文中对 HTAP、MySQL 兼容生态和同步链路需求的判断,可迁移到类似高可靠、强一致的数据平台建设中。

学习路线TiDB 社区博客 - 实践案例

TIDB考证过错

作者作为分布式数据库从业者,完整记录了通过 TiDB 官方 PCTA、PCTP、PCSD 三级认证的过程与备考策略。他将三个阶段分别类比为 AI 预训练、领域微调和推理增强:PCTA 覆盖集群架构、Region/Raft/TSO、部署与工具;PCTP 聚焦生产管理、备份恢复、迁移和高可用,并以首考 41 分(及格 42)失败后强化故障演练二战通过的经历说明实战的重要性;PCSD 则转向 SQL 开发侧,考察索引、执行计划、事务与在线 DDL 等细节。文章给出了各级别的知识点权重、官方课程和练习方法,对打算系统学习 TiDB 认证的人有路线图式的参考价值。其边界在于内容围绕官方认证展开,考试细节会随版本变化,未对底层原理展开深入讲解。

推荐收录。它提供了完整的 TiDB 认证路线和结合实际故障演练的备考方法,尤其记录了 PCTP 失败后的调整策略,对准备官方认证或学习 TiDB 运维/开发的读者有直接参考价值。虽然内容随版本可能时效受限,但作为入门路线图仍值得借鉴。

技术文章Crunchy Data Blog

Postgres Calculations and the Ambiguity of NULL

文章深入剖析 PostgreSQL(以及其他 SQL 数据库)中 NULL 的三值逻辑语义。作者从 NULL 代表“未知”而非某个值出发,依次讲解了比较运算、布尔逻辑、算术、NOT IN、聚合、窗口函数、字符串拼接和排序中 NULL 的行为差异,并用大量可运行的查询示例展示常见错误。例如 active OR NOT active 并非永真,NOT IN 遇到 NULL 会返回空集,聚合函数会忽略 NULL 而 COUNT(*) 不会,窗口函数中的 lag/first_value 不会自动跳过 NULL,字符串拼接 || 遇到 NULL 直接返回 NULL 而 concat 会将其视为空串,NULL 默认排序高于所有真实值。文章还介绍了 IS NOT DISTINCT FROM、COALESCE、NOT EXISTS、FILTER、concat_ws、NULLS FIRST/LAST 等处理手段,并预告 Postgres 19 的 IGNORE NULLS 子句。最后强调应根据业务规则显式处理 NULL,或在表结构中用 NOT NULL 约束从源头避免歧义。适合所有使用 SQL 的开发者阅读。

推荐收录。文章不是简单罗列语法,而是从三值逻辑原理出发系统解释 NULL 在各 SQL 子句中的一致与不一致表现,并给出可迁移的排查清单。案例覆盖 WHERE、NOT IN、聚合、窗口函数、拼接、排序等高频场景,对数据工程师、后端开发者和数据库维护者都有直接参考价值。其清晰的问题定位方式和标准引用也适合作为团队内部 SQL 培训材料。风险在于示例基于 Postgres,部分行为在其他数据库略有差异,但核心概念通用。

技术文章ClickHouse Engineering

New system views in PostgreSQL 19

文章系统介绍 PostgreSQL 19 新增的四个系统视图,并结合作者亲自演示给出查询示例与语义边界。pg_stat_lock 提供按锁类型聚合的集群级锁等待统计,但 waits 与 wait_time 仅统计等待超过 deadlock_timeout 且最终成功的锁,fastpath_exceeded 可提示分区密集负载需调高 max_locks_per_transaction。pg_stat_recovery 以单次原子快照返回备库恢复状态,解决了多次函数调用间数值不一致的问题;pg_stat_autovacuum_scores 暴露新的 autovacuum 优先级评分与各分量权重;pg_dsm_registry_allocations 让运行时动态共享内存分配可见。作者提醒 PG19 仍处 beta、列名可能变更,且评分视图基于当前统计,只是 autovacuum 行为的提示而非保证。

推荐收录。文章不止罗列新视图,还用可复现的会话示例讲清语义细节与陷阱,例如 pg_stat_lock 只在等待超过 deadlock_timeout 时计数、fastpath_exceeded 与 max_locks_per_transaction 的关联,以及评分视图的近似性。适合 DBA、SRE 和构建 Postgres 监控与 HA 工具的读者,作为升级 PG19 时观测能力的参考。

工程实践PlanetScale Blog

What is a Neki router?

文章深入解析了 PlanetScale 的 Neki 路由器在分片 PostgreSQL 数据库中的核心作用与实现机制。它指出分片数据库的难点在于决定查询应路由到哪些分片,Neki 为此引入了双层计划:先由路由器基于数据拓扑生成 Neki 计划,再将改写后的 SQL 交给各分片上的 PostgreSQL 生成传统执行计划。文章通过单点路由和 scatter-gather 两个具体示例,展示了路由器如何识别分片键、绑定参数、推送 limit、汇总多分片结果,并利用侧车进程通过 gRPC 转发工作。同时说明了路由器无状态、可独立扩展的特点,以及与 PgBouncer 等连接池工具的差异。文章还点明了 Neki 的两个缩放维度:分片扩展数据和 PostgreSQL 引擎,路由集群扩展分布式查询处理与连接管理。整体对理解分布式数据库查询路由与分片架构具有很好的参考价值。

推荐收录。文章不是抽象的理论介绍,而是直接展示 Neki 路由器的双层计划、分片路由和 scatter-gather 的具体实现,包含 EXPLAIN 输出和架构组件说明,证据具体。适合数据库内核工程师、分片库用户及分布式系统架构师阅读;其中关于无状态路由器、连接处理与查询处理分离的设计思路,可迁移到其他分布式数据库或网关类系统。

工程实践TiDB 社区博客 - 技术解读

数据库安全合规方案:等保三级/加密/审计/访问控制完整设计

本文以 TiDB 为例,系统设计了一套满足等保三级要求的数据库安全合规方案。文章从身份鉴别、基于角色的访问控制(RBAC)、传输加密(TLS/mTLS)、存储加密(TDE)和 SQL 级审计追踪五个维度展开,给出了具体的 SQL、YAML 配置和审计日志流转架构。作者还量化了 TDE 对读写性能的影响(写入约 3-5%、读取小于 2%),并基于 QPS 和 SQL 长度估算了审计日志的存储开销,最后提供了等保三级落地检查清单和常见问题解答。方案面向 TiDB 数据库,技术上具有可操作性,但部分能力(如 KMS 密钥管理)依赖云厂商服务,性能与存储估算也需要在真实业务负载下验证。

推荐收录,因为它不是泛泛的安全理念,而是围绕等保三级这一具体合规目标给出的可执行配置模板,覆盖身份、授权、加密、审计的完整链路。对负责数据库安全、合规落地的 DBA、安全工程师或架构师,文中的 RBAC 设计、审计告警规则和性能数据都有直接参考价值,可迁移到其他支持类似特性的分布式数据库。不过需要注意,配置细节和云厂商绑定可能随版本更新,落地前应做实际环境验证。

工程实践PlanetScale Blog

How one connection kills a database

文章以GitHub面试题为引,解析了一个真实数据库故障链路:一个应用异常导致事务未提交,连接持有读锁;随后一个需要排他锁的schema change被阻塞,而后续所有对同一表的查询都排队等待,最终整个应用无法执行查询。作者用Postgres和MySQL的例子逐步复现了该过程,并指出根因之一是Postgres默认关闭的idle_in_transaction_session_timeout。文章随后介绍了PlanetScale提供的连接管理工具,包括Dashboard和CLI,可以查看阻塞连接、取消查询、终止事务或断开连接,并强调了保留管理连接以应对连接耗尽场景的设计。最后也涉及了该场景下如何避免锁等待以及Vitess在线DDL的优势,但文章带有明显的产品推广倾向。

文章清晰还原了未提交事务阻塞迁移并拖垮整个数据库的典型故障链路,提供了可复现的实验步骤和根因解释,对数据库运维、DBA和应用开发者都有直接参考价值。虽然结尾有PlanetScale产品推广,但核心的技术分析和锁排队原理可迁移到任何关系型数据库场景,值得收录。

工程实践TiDB 社区博客 - 实践案例

如何在内网配置 TiDB 数据库 Agent

文章以内网环境为背景,详细演示了通过 MCP SSE 模式将 TiDB 数据库能力接入 Dify 智能体平台的完整过程。作者先对比了原生 MCP(SSE)与 FastAPI + OpenAPI 两种接入方案的适用场景,指出前者适合快速原型和内部数据分析,后者更适合生产环境和复杂业务流。随后给出在 RockyLinux 上配置阿里云源、安装 Docker、部署 Dify、克隆 pytidb 项目、创建 Python 虚拟环境并启动 SSE 服务的具体命令和排错要点。文章还展示了在 Dify 中安装 MCP 插件、配置模型、创建 Agent 并编写系统提示词的步骤,最后通过四个对话场景验证了 Agent 查询集群信息、表结构和执行只读 SQL 的能力。文章适用于内网数据库 AI 化改造的入门实践,但未深入讨论安全管控、SQL 注入防御或大规模并发下的性能问题。

推荐收录,因为文章提供了从环境准备到 Agent 联调的可复现操作路径,并明确对比了 MCP 与 FastAPI 两种方案的安全性与适用边界。对需要在内网快速搭建数据库 AI 助手的工程师、数据分析师或低代码团队有直接参考价值,关键的环境配置和排错步骤可迁移到类似场景。

工程实践TiDB 社区博客 - 实践案例

《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》

本文记录作者基于 Dify、FastAPI 与 PyTiDB 构建大模型驱动 TiDB 智能运维 Agent 的完整实践。文章先说明了每层的职责划分:Dify 作为 Agent 编排与 LLM 调度层,FastAPI 提供 RESTful 接口并执行参数校验和安全控制,PyTiDB 作为 Python 数据访问层连接 TiDB 集群。随后详细介绍了 Ollama 本地部署 DeepSeek 模型、Dify 安装配置、Python 虚拟环境搭建与依赖安装、FastAPI 服务编写、systemd 服务配置以及通过 OpenAPI Custom Tool 将后端服务注册为 Dify 工具的过程。文中提供了完整的 app.py 代码,并明确限定 /db/execute-sql 接口仅允许 SELECT/SHOW/EXPLAIN/DESC 只读操作,以规避大模型生成 SQL 的安全风险。作者最终用自然语言查询集群拓扑、会话列表等验证了通路,同时指出本地小模型效果有限、建议使用在线模型,并强调该方案仍是 demo 级别,未覆盖生产环境的权限管理、审计与高并发场景。

推荐收录。文章不是简单概念介绍,而是给出从环境部署、代码实现到系统集成验证的完整链路,尤其对 FastAPI 作为 LLM 与数据库之间的安全隔离层做了可复用的设计。适合数据库运维、AI 应用工程化以及希望将自然语言接入私有数据系统的读者参考,可直接照搬其分层思路与只读 SQL 防护模式;但需注意生产环境仍需补充鉴权、SQL 白名单与操作审计。

工程实践TiDB 社区博客 - 实践案例

告别满屏慢 SQL,物联网智慧停车平台上线 TiDB

文章记录智慧停车平台从 PolarDB 迁移到 TiDB 的过程,背景是核心表每年新增约 2.4 亿条数据,大表到 8000 万行后出现慢 SQL、跨停车场 join 困难等问题。团队实测对比 TiDB、ClickHouse 等数据库,最终选择 TiDB v8.5.2,原因包括 MySQL 兼容、压缩成本低、社区活跃等。迁移采用 Dumping 导出加 Lightning 导入,并借此规范了索引设计和代码中的排序逻辑。上线一年多后,慢 SQL 从满屏降到每天约 46 条,监控和告警体系从无到有,运维变为主动。文章最后给出选型建议:小场景用 MySQL,中大型 SaaS 用 TiDB,分析密集型可用 HTAP。内容属于真实的数据库迁移工程案例,但来源为 TiDB 官方博客,存在一定的推广立场。

推荐收录,因为它展示了在停车业务高可用约束下,数据库选型、迁移和运维改进的完整链路,包含数据规模、慢 SQL 数量、迁移工具等可量化证据。对于面对大数据量 join 问题和分布式数据库选型的工程师,文中的对比方式和迁移后治理经验有直接参考价值。需要注意的是,文章由数据库厂商发布,性能收益数据缺乏独立验证,读者应结合自身场景做验证。

工程实践ClickHouse Engineering

So, is ClickHouse winning the observability wars?

本文是 ClickHouse 团队对 Mat Duggan、Charity Majors 提出的“ClickHouse 正在赢得可观测性战争”观点的回应与剖析,明确“胜利”仅限定在存储与查询层。文章解释列式架构为何契合可观测性数据:按列存储与排序键利于压缩编码,稀疏主索引与跳数索引减少 I/O,向量化执行、SIMD 与跨分片并行加速聚合,并缓解高基数问题。还讨论了全文检索倒排索引、单库承载日志/追踪/部分指标、SQL 表达力与 Apache 2.0 许可带来的采纳优势。作者也坦承边界:Prometheus 式指标的 PromQL 兼容仍是最大缺口,TimeSeries 引擎与 API 尚不稳定,数据库本身不等于好的可观测性产品,小团队或自建引擎的厂商未必适用,并指出 Agent 工作负载带来低延迟、高并发与全保真留存的新要求。

推荐收录。文章虽出自厂商博客,但系统梳理了列式存储契合可观测性数据的机制——压缩、索引裁剪、向量化、并行聚合与高基数处理,并较诚实地指出 PromQL 兼容、ordering key 与 schema 设计等边界,适合负责可观测性平台或日志/追踪存储选型的工程师参考。其架构权衡与“何时不适用”的判断有可迁移价值,但读者需注意其自证立场与客户证言带来的偏向。

技术文章ClickHouse Engineering

What's new in the ClickHouse .NET Driver: the road from 1.0 to 1.3

文章梳理 ClickHouse .NET 驱动从 1.0 到 1.3 的演进,核心是类型安全与可扩展性。它用 POCO 注册取代 object[] 手写列映射,实现强类型插入和读取;并新增 IParameterTypeResolver、IParameterFormatter、IReadValueConverter 三个扩展点,分别控制参数类型推断、序列化和读取值转换。类型支持上加入多维数组、ValueTuple 和 Identifier 参数;正确性上修复 DateTime 时区被服务端 session_timezone 平移的破坏性变更及 Variant NULL 等问题。性能上允许跳过插入 schema 探测,并将默认 ReadBufferSize 从 512 KiB 降至 8 KiB,显著降低 LOH 分配与 GC 压力。文章还介绍 EF Core、Serilog 等集成和路线图,适合 .NET 数据开发与客户端 API 设计参考;作为版本发布说明,部分 API 细节会随版本更新而过时。

推荐收录,因为文章用大量代码示例和基准数据说明 .NET 驱动的具体工程决策:POCO 映射与三个可插拔扩展点的 API 设计、ReadBufferSize 从 512 KiB 降至 8 KiB 带来的 LOH 与 GC 优化,以及 DateTime 时区语义的破坏性修正。这些内容对使用 ClickHouse 的 .NET 开发者和设计数据库客户端、序列化管道的工程师有直接的可迁移价值;但它是版本发布说明,具体 API 细节会随驱动版本演进而过时,建议结合最新文档使用。

工程实践ScyllaDB Engineering

Building a New Rust Driver for ScyllaDB’s DynamoDB API – with 58% More Throughput

文章介绍了为 ScyllaDB 的 DynamoDB 兼容 API(Alternator)构建新 Rust 驱动程序的工程实践。由于 AWS DynamoDB SDK 面向单端点托管服务,无法利用 ScyllaDB 多节点多分片的分布式架构,团队基于 aws-sdk-dynamodb 封装了新的 alternator-client-rust,通过 Interceptor 机制注入拓扑感知的负载均衡、头部剥离和请求压缩等优化,保持 API 兼容并实现了约 58% 的吞吐量提升。文章还详述了扩展 Latte 基准测试工具支持 DynamoDB API 的过程,采用条件编译隔离 CQL 与 Alternator 逻辑,并通过 Rune 脚本提供灵活的工作负载描述。基准测试对比了 Latte 与 YCSB 的差异,以及新驱动在不同负载均衡策略下的表现,指出在热分区和轻量事务场景下 key affinity 策略优于 round-robin。文章基于特定 ScyllaDB 版本和测试环境,结果适用于使用 ScyllaDB Alternator 的高吞吐场景,但对其他数据库或云服务的可迁移性有限。

推荐收录,因为它展示了从适配现有 SDK、定位吞吐瓶颈到实现负载均衡与压缩优化并完成基准验证的完整工程链路,提供了可量化的性能数据和具体的架构取舍。对从事数据库驱动开发、分布式系统客户端优化或基准测试工具设计的读者,文中的拓扑感知路由、拦截器使用和条件编译改造方法具有直接迁移价值;同时需注意其结论依赖 ScyllaDB 特定架构。

工程实践TiDB 社区博客 - 实践案例

TIDB PCSD学习,了解TIDB和OB的SQL语法差异

作者结合TiDB免费认证学习经历,对TiDB与OceanBase做了MySQL语法兼容性对比测试。测试围绕外键关联表、RANGE/LIST/HASH及复合分区表、在线索引DDL、前缀索引和存储过程等对象的DDL/DML展开,并检查执行计划与错误提示。结果显示两者对MySQL基本语法均兼容,都支持外键约束、普通分区和在线加索引;差异在于TiDB不支持复合分区与存储过程,OB支持;索引选择路径与报错信息也有不同。文章给出完整测试SQL、版本信息和结果截图,但未涉及性能、事务隔离、复杂查询等场景,对比深度停留在功能支持层面,且针对特定版本,结论时效性有限。

文章以可复现的SQL脚本和截图直接对比TiDB与OceanBase在MySQL兼容性上的功能差异,覆盖外键、分区、索引和存储过程等迁移常见场景,对分布式数据库选型和MySQL业务迁移评估有直接参考价值。适合DBA、架构师和迁移项目成员;测试方法可迁移,但结论基于特定版本,使用时需结合最新版本文档复核。

个人心得TiDB 社区博客 - 实践案例

从 MySQL 到 TiDB:三大认证考取后的回顾与思考

本文作者是一名数据库运维工程师,在一年多内先后考取 MySQL OCP、TiDB PCTA 和 PCTP 认证,并完整复盘了这段经历。文章先说明考证动机来自业务增长和团队引入 TiDB,随后分别回顾三场备考:MySQL OCP 补全了 MVCC、半同步复制等底层原理;PCTA 帮助建立对 TiDB 计算、存储、调度分离架构的认知,并记录了一次扩容磁盘告警的踩坑;PCTP 则深入分布式执行计划、TiKV 底层和集群调优。作者总结了认证是系统化学习的起点,MySQL 与 TiDB 互补而非替代,分布式数据库对 DBA 能力提出新要求,并强调动手实验的重要性。最后给出夯实 MySQL 基础、以认证为脚手架、多动手、关注社区等建议。文章适合数据库运维人员和计划学习分布式数据库的工程师参考,但属于个人经验分享,深度和通用性有限。

文章以真实考证经历为基础,具体描述了从单机数据库到分布式数据库的学习路径和常见陷阱,对数据库运维人员有直接参考价值。它强调了认证考试作为知识体系化工具的价值,并给出了可执行的实验和学习建议,可迁移到其他数据库技术栈的学习中。主要风险是个人经验成分较多,部分结论需结合实际场景验证。

工程实践Andy Atkinson

PostgreSQL 18: 23x Faster Inserts With UUID V7

文章记录了生产环境中将PostgreSQL主键从UUID v1/v4迁移到UUID v7后获得的性能收益。作者在Postgres 18.4上通过alter table修改列默认值为uuidv7(),针对部分高频插入表观察到平均插入耗时最多降低23倍,并以表格形式列出6x、8x、9x、20x、23x五档提升案例。文中解释了随机UUID(v4)导致B-tree索引页分裂、缓存命中率下降的机制,对比v7单调递增带来的热页优势;同时重点讨论了在线切换的难点——ALTER TABLE需要ACCESS EXCLUSIVE锁,作者通过设置lock_timeout和statement_timeout配合PL/pgSQL循环重试(带抖动退避)找到了锁窗口,并预告了取消阻塞查询的预案。文章最后指出v7时间戳会暴露记录创建时间这一隐私边界,以及该方案并非对所有表都有效。

这是一篇真实、可验证的PostgreSQL性能优化工程案例,提供了从性能问题分析、方案选型、锁管理到线上实施验证的完整链路。适合使用PostgreSQL并关心写入性能或在线DDL的DBA与后端工程师,文中的锁超时加重试策略和UUID选择依据可以直接迁移到类似系统。

技术文章ClickHouse Engineering

Read your writes: WAIT FOR in PostgreSQL 19

文章介绍 PostgreSQL 19 新增的 WAIT FOR 命令,用于在异步流复制下实现 read-your-writes 一致性。作者先描述陈旧读问题:主库提交后从库需重放 WAL 才能看到变更,并对比 synchronous_commit=remote_apply、应用侧轮询 pg_last_wal_replay_lsn()、直接读主库三种旧方案在延迟与扩展性上的代价。核心方法是在主库写入后用 pg_current_wal_insert_lsn() 取 LSN,把它传给从库会话执行 WAIT FOR,阻塞至 WAL 重放到该位置;命令支持 standby_replay/standby_write/standby_flush/primary_flush 四种模式及 TIMEOUT、NO_THROW 选项。文章还解释它必须是顶层工具命令的原因:会话持有快照会阻塞 WAL 重放,形成自死锁,因此不能放进函数、过程或高隔离级别事务。边界在于 PostgreSQL 19 仍处 beta、细节可能变化,且 LSN 比较不识别 timeline,主从切换后需谨慎对待。

该文以官方文档、SQL 示例和提交历史为依据,给出 WAIT FOR 的可用语法、四种等待模式与 LSN 传递方式,并深入解释“必须顶层运行、不能持有快照”的自死锁成因,属于可长期复用的数据库机制解析。适合使用 PostgreSQL 异步复制、希望在不付同步复制开销下获得读己之写一致性的后端与 DBA 读者,也可迁移到连接池或协议感知代理注入 WAIT FOR 的设计;需注意其基于 beta 版本且 LSN 不识别 timeline。

工程实践ClickHouse Engineering

ClickGap: Autonomous QA for ClickHouse

文章复盘 ClickHouse 自研自主 QA 智能体 ClickGap 的构建过程:它监听合并流,对每个已合并 PR 用真实构建设计并执行测试、二分定位引入回归的提交,并在无人工确认下向公开仓库提交 issue 与 PR,五个月内产出约 500 个 issue、200 余个覆盖类 PR,其中 200 多个 issue 以关联修复 PR 关闭。重点并非模型能力,而是如何让结论可信:任何发现须先通过十道门禁(可复现测试、有效引用、全文件阅读、调用方分析、多路检索既有测试、对抗式审查、历史误报比对等),其中八道以确定性代码实现,只有覆盖杀灭测试与对抗裁决依赖模型判断。作者还描述了影响版本矩阵与二分、三层记忆结构及 Loom 记忆服务、按召回率与维护者响应率节流的成本模型,以及私仓实例冷启动与命名空间单向隔离。主要边界是方法高度依赖单一代码库的领域知识,记忆能否跨代码库迁移仍未有定论。

推荐收录:文章以真实运营数据(约 500 个 issue、200+ 关联修复、约 200 个覆盖 PR)和具体缺陷案例(gini 语义变更、skip index 失效、14.6–30.9% 性能回归)支撑,完整展示了把 LLM 代理接入高风险 CI 的工程取舍。适合构建 AI 代码审查/QA 系统、SRE 与数据库内核维护者,其中十道门禁、确定性优先、对抗式审查和基于结果的记忆反馈可直接迁移;需注意其精度主要来自单库领域知识,跨代码库复用仍待验证。

工程实践TiDB 社区博客 - 实践案例

宁波金唐 × 平凯数据库:医疗卫健全域场景落地实践

本文是宁波金唐与平凯数据库(TiDB企业版)在医疗行业落地实践的技术复盘。文章首先分析医疗国产化的特殊挑战,如系统数量多、新旧兼容、7×24小时高可用和海量数据混合负载,然后介绍宁波金唐的选型策略,强调分布式与集中式数据库需按业务规模取舍,并看重TiDB对中小型至大型机构的全场景覆盖、HTAP能力和MySQL生态。通过宁波市全民健康信息平台和海曙区一体化医疗云平台两个案例,作者给出具体性能数据,如诊断匹配查询从109秒降至0.281秒,年度收入报表从350秒降至6秒,并指出性能提升来自数据库能力、冷热分区和持续调优的共同作用。文章也提到迁移后仍需依赖厂商协同调整SQL和索引,并展望医疗AI对高质量数据底座的需求。总体以真实系统规模和多组对比数据为基础,但视角偏厂商合作方,可能弱化迁移中的风险和成本。

本文提供了一手医疗行业数据库国产化迁移的工程案例,包含选型判断、架构决策、真实系统规模和对比性能数据,对负责数据库选型、迁移或医疗信息系统的读者有直接参考价值。可迁移的不仅是具体优化技巧,更是从业务需求出发评估分布式vs集中式数据库、以及迁移后持续调优的思路。由于文章由TiDB社区发布,部分表述带产品宣传倾向,读者应关注其方法和数据,而非单纯的产品结论。

工程实践DuckDB Engineering Blog

How DuckDB Runs Recursive CTEs Faster

本文来自 DuckDB 工程博客,介绍了 v2.0 对递归 CTE 执行引擎的重构,目标是消除迭代间重复调度与重建状态的开销。核心方法是将物理算子树、预计算调度投影和可复用执行器池归查询计划所有,递归调用持有跨 epoch 的不变状态(如基于静态表构建的哈希表),每个 epoch 仅重置依赖前沿的状态,并通过精确的边界基数选择内联或并行调度。针对 USING KEY 递归,冻结键控状态以支持直接探测,内连接可用 RECURSIVE_KEY_JOIN 或部分键索引,并引入语义变化:UNION 仅转发最终发生变化的键,UNION ALL 仍转发全部候选。实验显示,在 100 万边可达性查询中延迟从 4.051 秒降至 0.095 秒,LDBC SF100 路径查询提速 6.55 倍且峰值内存下降,63 个递归基准几何均值改善 5.5%。适用边界包括:保留状态需可重复性证明,预聚合要求聚合状态可组合且无顺序依赖,宽唯一键更新场景有约 6% 的回归。

直接证据是作者为 DuckDB 核心开发者,提供了 PR 编号、EXPLAIN 分析与中位数基准对比,且讨论了语义变化与回归。适合数据库内核开发者、查询引擎研究者与对 SQL 递归性能优化感兴趣的读者。可迁移价值在于状态所有权划分、基于实测基数的自适应执行和变更键去重思想;风险是部分语义变更(UNION 改变行为)需使用者注意。

工程实践DuckDB Engineering Blog

DuckDB Table Functions in Java

文章介绍 DuckDB Java 客户端新增的纯 Java 表函数能力,允许开发者将任意 Java 可访问的数据源注册为 SQL 表,从而在单节点上完成跨远程系统与本地文件的异构查询,无需导出或中间表。作者以 MongoDB 为例,通过 DuckDBFunctions.tableFunction() 注册 mongo_query 函数,并详细说明 bind、init、apply 三个回调:bind 声明输出列,init 打开游标,apply 将数据按 2048 行向量块写入结果。文章强调该方式复用官方 Java 驱动、过滤条件下推到源端,且避免了原生扩展的构建与 JVM 崩溃风险。同时明确当前限制:表函数无法打包为 DuckDB 扩展,只能在 Java 客户端内使用;bind/init 对象生命周期需手动管理;STRUCT、LIST 等复合类型尚未支持。

文章来自 DuckDB 官方工程博客,提供了完整的表函数生命周期实现示例、与本地文件的交叉连接演示以及清晰的局限性说明,属于有深度且可直接迁移的工程实践。适合需要在 JVM 环境中将既有 Java SDK 或 JDBC 数据源接入 DuckDB 的工程师,可避开 C++ 扩展开发,降低维护风险。注意该 API 仍在演进,使用前应确认当前版本对生命周期管理和复合类型的支持。

技术文章Fzakaria Blog

Actually Queryable Executables

本文介绍了一种名为 SELF 的可执行文件格式构想:将程序本身构建为一个 SQLite 数据库,利用 Linux 的 binfmt_misc 机制通过自定义解释器执行,使得可执行文件的内容、元数据乃至运行状态都可以用 SQL 查询和修改。作者给出了一个可运行的 proof-of-concept 服务器 self-httpd,该服务器的程序代码、网页内容、访问日志和业务数据全部存放在同一个 SQLite 文件中,运行时可对自身文件进行 ACID 事务写入,并支持在线更新页面、全文检索和跨版本迁移。文章对比了 redbean 的 ZIP 自解压方案,指出 SELF 借助 SQLite 将容器与查询能力合二为一。文中也说明了当前限制,例如 /proc/self/exe 不可用,以及原型仍较为粗糙。整体上展示了将可执行格式重新定义为数据库后,现有 SQL 工具链可以大幅简化二进制分发、部署和审计流程。

推荐收录。文章提出了一个真正可运行的原型,并用 self-httpd 演示了程序自身可查询、可事务更新、可全文检索等能力,不是空泛概念。它对研究可执行格式、系统软件架构和部署简化的读者有很强的启发价值,其将二进制内容映射为数据库行的方法可以直接迁移到其他工具链设计中。需要注意目前实现依赖 binfmt_misc 且尚不成熟,但作为长期参考和创意起点价值明显。

技术文章Simon Willison

Your executable is a SQLite database

本文介绍了一种巧妙的 Linux 模式:将 SQLite 数据库文件本身制作为可执行的二进制程序。核心做法是,把 SQLite 文件格式中第 68 字节开始的 4 字节应用 ID 设置为 `SELF`(Structured Executable & Linkable Format),并按照特定 schema 将 ELF 可执行格式的各组成部分放置到多个 SQLite 表中。随后,一个用 C 编写的 `self-exec` 解释器可以从这些表中提取并执行相关代码,从而实现一个既是数据库又是可执行文件的混合体。文章还说明了如何利用 Linux 的 `binfmt_misc` 机制注册文件模式,让内核在遇到这种文件时自动调用解释器,无需额外手动触发。文中给出了 schema 链接、解释器源码以及 NixOS 下的配置示例,足以引导读者复现和理解这一机制。该技巧既展示了对 SQLite 文件头和 ELF 格式的深度利用,也局限于以 Linux 为平台的实验性场景,并不适合作为生产级应用方案。

推荐收录。文章直接展现了 SQLite 文件头自定义应用 ID 与 Linux ELF/binfmt_misc 结合的完整思路,并附有 schema 和 C 代码链接,证据具体且可复现。对研究文件格式、操作系统机制或做创意工具设计的读者是很好的起点;其可迁移价值在于将数据存储格式与可执行文件格式融合的架构思想,风险是这更偏向实验性技巧,实际应用需谨慎。

工程实践TiDB 社区博客 - 实践案例

实战复盘:一次 40 分钟的 add index 卡 0 行救援 —— 从 GitHub Issue #65948 看 TiDB disttask 孤儿任务的隐蔽危害

文章复盘了 TiDB 7.5.x 生产环境中一次 CREATE INDEX 卡在 write reorganization 且 ROW_COUNT 恒为 0 的故障救援过程。故障根因被定位为 DXF(disttask 框架)残留孤儿任务:历史中断的 add index 在 mysql.tidb_global_task 中留下长期处于 pausing/reverting 状态且 dispatcher_id 为 NULL 的条目,框架 scheduler 因内存态不刷新而持续调度这些僵尸任务,占满调度槽位,导致新的 ingest 模式索引任务无法推进。作者完整记录了 40 分钟排查链路,包括 AI 协助查证系统表、发现 tidb_enable_dist_task 开关被误关、最终通过滚动重启 tidb-server 清空框架内存态恢复服务,并提供了分场景的临时解决方案、每日巡检脚本、业务规范以及对 TiDB 团队在 scheduler 超时回收和内存态一致性方面的改进建议。文章还反思了 AI 在故障排查中作为“军师”与用户作为“侦察兵”的协作模式及其边界,指出 AI 缺乏现场执行权,有效协作依赖完整证据输入。

推荐收录。文章以真实生产事故为样本,完整呈现了从现象、日志证据、系统表探查到根因确认和恢复操作的故障处理闭环,并给出了可复用的 SOP、巡检脚本和预防规范,对负责 TiDB 运维或分布式数据库稳定性保障的工程师有直接参考价值。其对 AI 协同排查方式的反思也提供了可迁移的人机协作模式,但读者需注意文中操作涉及直接修改系统表和重启集群,须在受控环境验证后使用。

技术文章ClickHouse Engineering

ClickHouse Release 26.7

文章是 ClickHouse 26.7 版本发布说明,主体是对查询执行与向量检索内部优化的解析。它把按序聚合与新增的 limit 下推融合,使 GROUP BY…ORDER BY…LIMIT 成为可提前终止的流式流水线;JOIN 新增构建键驱动的探测端 granule 裁剪、哈希表行引用压缩与 dpsub 连接顺序算法;QBit 引入 Int8 量化、跨步存储、Hadamard 旋转与量化编解码器。文中用 TPC-H 与 HackerNews 数据集给出基准,称 Top-N 提速 313 倍、峰值内存降 592 倍,JOIN 提速 6.2 倍。还简述短语位置索引、EXPLAIN ANALYZE、Remote 引擎和 URL 统一等特性,并标注部分能力为实验性。

推荐收录:虽为版本发布说明,但每项优化都给出机制解释(如按序聚合与 LIMIT 下推融合、运行期过滤器驱动 granule 裁剪)和可复现的 TPC-H/HackerNews 基准,属于有边界、可验证的工程性能证据。适合数据库内核、OLAP 查询优化与向量检索方向读者;排序键前缀聚合、构建侧过滤下推等思路可迁移。主要风险是性能倍数依赖特定数据集与硬件,不宜直接外推。

技术文章PlanetScale Blog

The history of Postgres sharding

文章回顾了Postgres分片技术二十年来的演进。作者先从“shard”一词在Ultima Online游戏中的起源讲起,说明MySQL因LAMP生态先行形成了Vitess等成熟方案,而Postgres则长期依赖各公司自建。随后梳理了Skype的PL/Proxy、Instagram的逻辑分片、Citus扩展、PgDog代理、Aurora以及Spanner/CockroachDB/Yugabyte等Postgres兼容分布式数据库,逐一分析其架构与取舍。核心观点是显式分片比自动分片更可预测,原生Postgres集群比兼容层更可控。文章最后介绍PlanetScale推出的Neki,宣称结合历史经验提供显式分片、水平扩展路由器并托管备份恢复,但该部分带有明确的产品推广色彩。整体适合作为了解Postgres分片方案演进的入门综述,但对Neki的介绍需要以批判视角审视。

推荐收录,因为文章系统梳理了Postgres分片从PL/Proxy到Citus再到Spanner兼容方案的完整脉络,并给出了每个方案在运维复杂度、路由瓶颈、跨分片查询上的具体取舍,能帮助数据库团队在做分片决策时建立历史坐标系。适合数据库工程师、架构师阅读。需注意文章后半部分是PlanetScale自家产品Neki的推广,作为技术评述存在立场偏差,读者应区分事实与产品主张。

工程实践Fzakaria Blog

Your executable is a SQLite database

文章提出用 SQLite 数据库文件替代 ELF 作为 Linux 可执行格式,作者在 NixOS 上实现了名为 SELF 的原型。核心做法是把程序头、加载段、符号表等建模成 SQL 表,利用 SQLite 的 application_id 和 binfmt_misc 让数据库文件可直接执行,并编写 self-exec 解释器完成加载、重定位和跳转。文中还展示两种动态链接方案:通过 glibc rtld-audit 用 SQL 查询替换库查找,以及完全用 SQL 实现 dynamic linker;并把整个 userland 的 723 个可执行文件及其依赖打包进一个 611.9 MiB 的数据库。基准显示单文件体积约为 ELF 的两倍,启动有约 5ms 固定开销且缺页共享受限,但通过 closure 去重后整体体积反而略小于源 ELF。文章明确承认这是原型,兼容性和性能仍是适用边界。

推荐收录。文章不是概念空想,而是给出可运行的 SELF 原型、SQL schema、加载器和完整基准,并用一个 723 可执行文件的 userland 数据库验证了可扩展性。对操作系统、二进制格式、动态链接和数据库方向的工程师与研究者,它能启发将“格式”重新理解为可查询数据模型,且作者对体积、延迟和缺页共享的量化边界值得迁移。

工程实践The Consensus - Articles

Another look at SQLite's WAL-Reset bug

文章深入复现并分析 SQLite 长期存在的 WAL-Reset 并发缺陷:checkpoint 过程中因读到了陈旧的共享内存状态,可能把已提交的 WAL 帧误判为已回填并丢弃。作者用约 100 行 C 代码构造两个线程、三个数据库连接的工作负载,借助大 mmap 拉长 checkpoint 的竞态窗口,仅通过公开 API 就在数秒内触发永久丢写,偶尔还会造成数据库文件损坏。文章逐行对照 wal.c 中的交织时序,并用 Thread Sanitizer 定位到 nBackfill 的原子写与陈旧读之间的冲突;在 3.53.0 修复版上不再复现,但在 SQLITE_DEBUG 构建下仍会触发一处断言失败。该复现依赖特定时序与较大数据库,缺陷本身仍较罕见,但说明应用主动执行 checkpoint 时需要关注丢写风险并及时升级版本。

推荐收录。文章给出可直接编译运行的约 100 行 C 复现代码,并逐行对应 wal.c 时序,稳定复现丢写与损坏,证据扎实且可验证。对使用 SQLite WAL、负责数据库可靠性或排查并发缺陷的工程师有直接参考价值,其竞态窗口构造、sanitizer 定位和版本对照验证的方法也可迁移到其他存储系统。

技术文章TiDB 社区博客 - 技术解读

TiKV中MVCC的具体实现解读

文章深入解读 TiKV 的 MVCC 实现,通过三个 Column Family(CF_LOCK/CF_WRITE/CF_DEFAULT)将锁、提交记录和历史版本编码进 key。它详细分析 Write、Lock 记录结构与 MvccTxn 的写缓冲机制,说明 Prewrite 的冲突检查、Commit 的原子提交点以及 Rollback 的显式回滚标记。读路径部分展示快照读如何按 commit_ts 扫描 Write Record 并定位数据版本。文章还总结锁与数据同地存储、Write Record 作为提交点、操作可重试、MVCC 与 Raft 解耦等设计动机,但以源码解析为主,未覆盖所有异常分支。

文章以源码和代码引用为证据,系统梳理了 TiKV 分布式事务中 MVCC 的完整机制,从数据布局、两阶段提交到读路径均有清晰解释,适合研究分布式数据库或事务实现的读者。文中对设计取舍的分析和可重试、分层解耦等思想可直接迁移到其他存储系统设计中。主要局限是偏重源码解读,版本迭代可能带来差异,但不影响长期参考价值。

技术文章TiDB 社区博客 - 技术解读

深度解读TiDB 的 HTAP

本文深度解读 TiDB 的 HTAP 架构,指出其核心并非简单拼凑事务处理与分析,而是通过一套统一架构实现实时性与隔离性兼得。文章以智能工厂为比喻,说明 TiKV 行存储负责高并发 OLTP,TiFlash 列存储负责大规模 OLAP,TiDB Server 通过成本优化器自动选择或混合使用两种引擎。关键机制在于 TiFlash 通过 Raft Learner 协议异步实时复制 TiKV 数据变更,对写入无阻塞,且能提供秒级数据新鲜度和快照级别一致性。作者还介绍了该架构在简化数据链路、实时决策、降本增效方面的实战价值,并列举广发银行、华安基金等案例。文章最后指出 TiDB 的 HTAP 是在实时性、一致性、易用性和混合负载之间寻求平衡,而非单点性能极致。

推荐收录,因为文章系统阐释了 HTAP 的架构设计内核,包括存储引擎分工、Raft Learner 复制机制和一致性保障,技术细节明确且具有可迁移的架构参考价值。适合数据库工程师、架构师以及关注分布式系统设计的技术人员阅读,可帮助理解混合负载场景下的取舍与实现路径。

工程实践TiDB 社区博客 - 实践案例

关闭tuned服务影响集群性能案例分析

文章记录了某数据库集群在运行过程中出现响应时间突增、CPU 使用率升高、整体性能下降的现象。排查时发现期间曾执行过 systemctl stop tuned.service 操作,即关闭了 tuned 服务。通过检查 /etc/tuned/ 目录未找到自定义配置,使用 tuned-adm list 确认当前配置为 throughput-performance,但因 tuned 未启动导致该配置没有生效。启动 tuned 服务后,throughput-performance 配置生效,集群性能恢复正常。文章还简要介绍了 tuned 是系统级动态调优守护进程,throughput-performance 模式会关闭节能机制、启用 sysctl 优化、切换 I/O 调度器并将 CPU 调频策略设为 performance。该案例展示了操作系统服务配置对分布式数据库集群性能的显著影响,但缺少具体的性能指标对比与更深入的原因分析。

收录原因是它提供了一个真实的、可复现的运维排障案例:数据库性能劣化可能与 tuned 服务被关闭直接相关。对于负责数据库或分布式系统运维的工程师,文中通过 tuned-adm 检查配置、确认服务状态并恢复的排查路径具有直接可迁移性。但内容深度有限,建议结合官方手册进一步理解 tuned 参数细节。

工程实践DuckDB Engineering Blog

Chunked Query Results in the DuckDB Java Driver

文章介绍 DuckDB Java 驱动 1.5.3.0 新增的 chunked query results 功能,通过 DuckDBChunkedResult 让应用以惰性方式直接读取引擎生成的列式数据块,避免 JDBC ResultSet 逐行、逐值获取带来的开销。文章先解释了 DuckDB 的向量化执行与 JDBC 行式 API 的差异,指出传统驱动需要把 2048 行一列的数据块切片成行和单元格,导致不必要的转换成本。随后给出新 API 的使用示例,并总结了其特性:惰性拉取、列式访问、保留元数据、与 UDF 读取接口一致、使用零基索引。文章也明确列出了当前限制,包括仅支持基本类型、只适用于 prepared statement、reader 类型覆盖有限。结论强调 JDBC ResultSet 仍是大多数场景的合理默认,chunked API 面向返回大量数据且消费端也为列式的场景。

推荐收录,因为这是官方工程博客对新功能的设计与实现说明,清晰呈现了 JDBC 行式 API 与列式数据库引擎之间的适配问题,并给出了具体的新 API 用法、适用场景和当前局限。对需要在 Java 中高效消费 DuckDB 大结果集的开发者,以及关注数据库驱动和向量化执行接口设计的工程师,都有直接的参考价值。

工程实践SelectDB 技术分享

15 分钟搭建 PostgreSQL + Apache Iceberg + Apache Doris 的湖仓分析平台 搭建一条 CDC 实时数据同步链路,往往意味着要部署 Kafka、Debezium 等额外组件。有没...

文章以 PostgreSQL + Apache Iceberg + Apache Doris 为例,介绍如何用 OLake 快速搭建端到端的 CDC 湖仓分析链路。作者拆解了各组件角色:OLake 通过读取 PostgreSQL WAL 捕获变更并写入 Iceberg,Doris 作为查询引擎直接读取 Iceberg 表,并给出选择 Doris 的五个理由,包括全向量化执行、支持主流 Catalog、原生处理 Delete File、Time Travel 以及谓词下推和分区裁剪。随后提供完整部署命令和配置步骤,声称在一台小规格 Linux 实例上十几分钟即可跑通。文章还总结了生产环境关键注意事项,如控制文件大小、设计分区策略、定期执行 Snapshot 过期清理与 Compaction,以及按基础设施选择 Catalog。最后列举了业务实时看板、即席分析、SQL 分析平台和历史分析等应用场景。整体方案可快速复现,但 Demo 中使用本地 REST Catalog 属于简化做法,生产高可用与权限体系仍需另行设计。

这篇文章不是简单的产品介绍,而是给出了从组件选型、部署命令到生产调优的完整工程实践路径,其 OLake + Iceberg + Doris 的示例可直接用作实时湖仓链路的前期验证。适合正在评估 CDC 数据同步、开放湖仓架构或希望快速搭建可运行 Demo 的架构师和平台工程师。文章对文件大小、分区、表维护等注意事项的归纳可迁移到其他 Iceberg 湖仓场景,但需注意 OLake 仍属相对年轻的开源项目,并且部分性能结论来自官方或商业方的公开数据,迁移到大生产规模前应做独立验证。

工程实践ClickHouse Engineering

POSETTE Talk Recap - Postgres Isn't Slow. Your Storage Is

文章复盘 POSETTE 2026 演讲,围绕 PostgreSQL 规模化后的五类症状(写入变慢、P95 读延迟不稳、autovacuum 落后、checkpoint 争抢 I/O、逻辑复制积压),论证根因常被误判,实际多来自存储。作者用 8 个相同 m6id.4xlarge 集群、3.3 亿行 pgbench 随机 UPDATE 负载,对比本地 NVMe 与 3000 IOPS 的 baseline gp3 EBS,结果 NVMe 中位 16,030 TPS 对 EBS 1,734 TPS(约 9.24×),事务中位延迟从 36.9ms 降到 4.0ms。延迟拆解显示差距主要来自页读取、WAL fsync 与锁/调度等待,CPU 本身耗时接近;等待事件与 CPU profile 也印证 EBS 更多进程处于离 CPU 等待。作者随后给出本地 NVMe 生产架构:quorum 双 standby 同步复制、WAL-G 持续备份至独立对象存储,并明确结论仅适用于该负载与存储配置。

推荐收录:文章给出了可复现的对照实验设置、量化指标(TPS、延迟拆解、等待事件、CPU profile)以及面向生产的架构取舍,而非单纯观点宣导或产品广告。适合运行大规模 PostgreSQL、关注存储选型与高可用设计的数据库/SRE 读者,其“数据库与存储一起诊断”的思路及 NVMe+quorum 复制+对象存储备份的组合可迁移到类似系统;但需注意基准使用 3000 IOPS 基线 gp3,不同 EBS 配置结论会变化。

工程实践TiDB 社区博客 - 实践案例

Agent 基建不是设计出来的,是被 Kimi K3 和一堆应用公司卷出来的

文章基于TiDB团队近两年服务AI Agent应用(如Kimi、Dify)的实践,总结了Agent时代基础设施的演化路径与核心设计原则。作者唐刘指出,Agent产品规模化首先要解决“计算资源空闲成本”和“执行环境消失后任务恢复”两大难题,分别通过虚拟数据库(scale-to-zero、秒级就绪)和持久文件系统(Sandbox与Workspace分离)来应对。随着Agent任务变长,跨session记忆、文件与Git工作区持久化、可审计的权限与数据可信性成为新的需求,推动TiDB形成覆盖数据、记忆、文件和Lake分析层的Agent Stack。文章还提出了三个可迁移判断:先算空闲成本,从第一天拆分执行与状态,减少Agent跨系统边界。整体以真实客户案例为支撑,但内容带有TiDB产品推广成分,且结论主要基于个别头部客户实践,适用范围需读者结合实际验证。

本文以Kimi、Dify等真实Agent产品的业务需求为线索,详细拆解了Agent基础设施从数据库自动创建到记忆、文件系统、可靠分析层的演化过程,给出了具体的成本模型和架构取舍(如scale-to-zero、执行与状态分离)。适合正在构建Agent产品或关心AI基础设施底座的技术决策者阅读,其中的“先算空闲成本”“让Agent少跨系统边界”等判断可直接迁移到类似场景。不过文章源自TiDB商业推广,需注意案例的代表性与产品倾向。

工程实践TiDB 社区博客 - 实践案例

干货分享|杭州银行平凯数据库(TiDB 企业版)核心实践:从架构落地到开发治理的关键经验

文章以杭州银行新一代核心系统采用平凯数据库(TiDB 企业版)替换传统集中式数据库的实践为主线,总结了从架构落地到开发治理的完整经验。作者提出按业务等级差异化设计部署架构:普通系统采用单集群多副本,重要系统采用“3+1 副本”与自动同步复制,核心系统则按“5+1 副本”建设“两地三中心”容灾体系,实现 RPO=0、RTO 不超过 30 秒。在开发治理方面,文章重点说明了数据库对象命名、数据类型映射(如 Oracle 的 Number 与 ZHS16GBK 向 Decimal 与 UTF8MB4 的转换)、索引数量控制、联表数量和事务拆分等规范,并通过自研 DAP 平台将规范嵌入开发测试发布流程,以强控和提醒规则保证执行。文章还提到连接池生命周期配置、慢 SQL 日志关联和常态化巡检等运维治理手段。整体上这是一次金融级分布式数据库国产化的系统实践,但对于小型系统或非金融场景,部分设计可能偏重,需要结合实际业务等级裁剪。

推荐收录,因为文章基于真实金融核心系统上线案例,提供了从部署架构、容灾设计、SQL 规范到平台管控的完整闭环,具有明确的约束条件和取舍逻辑,不是泛泛的产品宣传。适合正在从事分布式数据库选型、迁移或国产化改造的架构师、DBA 和开发管理者参考,其中的分级部署思路、开发规范落地方法和连接池配置策略可迁移到其他数据库工程实践。

工程实践DuckDB Engineering Blog

DuckDB v2.0: Your Database Deserves a Better Parser

本文是 DuckDB 工程团队关于 v2.0 用 PEG 解析器替换 PostgreSQL 派生解析器的深度技术说明。文章先阐明解析器在查询流水线中的角色,并区分了 DuckSQL 方言与解析器实现本身。接着指出旧的 YACC/Bison LALR(1) 解析器在扩展语法时容易引入 shift/reduce 冲突,而 PEG 通过有序选择避免了这类冲突。工程化过程中,作者重点解决了回溯导致的指数级重复工作,借助 packrat 记忆化使得恶意输入(如大量未闭合括号)的解析时间从指数级降为近乎常数,并给出实测数据。文章还演示了运行时扩展语法的方法:扩展可注册自定义规则并复用 DuckDB 既有语法与转换函数,以 Google pipe query syntax 为例展示了从语法到 AST 的完整过程。最后说明扩展 API 仍是预览,若发现现有查询行为不一致可提交 issue。该文对数据库解析器设计、语法扩展机制和解析性能优化具有长期参考价值。

本文基于真实工程改造,给出了从动机、原型到生产化的完整路径,包含 packrat 记忆化解决指数级回溯的性能对比数据,以及通过扩展点复用现有语法和转换函数的具体 API 示例。适合数据库内核、编译前端或开发者工具方向的工程师阅读。文中的运行时语法扩展思路与回溯性能治理方法可以迁移到其他解析器或语言实现;需注意扩展 API 仍为预览,兼容性验证细节未完全展开。

工程实践TigerBeetle Blog

Protocol-Aware Deterministic Simulation Testing

本文介绍了TigerBeetle数据库在确定性模拟测试(DST)中引入协议感知(Protocol-Aware)的方法,从系统内部视角验证共识协议与存储引擎的安全性和活性不变量。作者对比了Jepsen式黑盒生成测试和Antithesis式确定性虚拟机的局限,指出它们只能通过用户可见API从外向内测试,无法深入协议内部。TigerBeetle利用逻辑与物理双重确定性,使集群副本达到字节级一致,并在VOPR模拟器中运行真实代码。协议感知DST允许对每个副本的WAL一致性、存储确定性(如Manifest和物理块校验)以及更深层的活性进行断言,例如确保无需协调时副本不会进入recovering_head状态,以及能从集群中任意副本修复缺失数据块。文章通过大量代码片段展示具体实现,并讨论了这种测试方法对快速复现复杂交错场景、调试协议级优化和确保长期可靠性的价值。

推荐收录,因为本文展示了如何将确定性模拟测试从系统级黑盒推进到协议感知的白盒深度验证,提供了具体的实现思路和代码依据,对从事分布式系统、数据库内核或可靠性工程的读者具有直接参考价值。其分层不变量检查方法和物理确定性设计可迁移到其他基础设施系统中,是测试方法论与工程实践结合的优质案例。

工程实践Crunchy Data Blog

Postgres 19: How Our Advice Has Changed Since We Wrote It

文章围绕 Postgres 19 的 beta 功能,回顾 Crunchy Data 多年来关于数据加载、TOAST、BRIN 索引、覆盖索引和分区管理的既有建议,并逐项说明哪些版本改变了这些建议的落点。作者指出核心原则仍成立:批量导入优先用 COPY,JSON 存 jsonb,索引是权衡,分区主要服务生命周期管理。主要变化包括 async I/O 显著加速堆扫描与 vacuum,COPY 新增 ON_ERROR 与 REJECT_LIMIT 等容错选项,LZ4 成为默认 TOAST 压缩算法,BRIN 增加 minmax_multi 与 Bloom 形状,B-tree skip scan 覆盖更多查询,以及并发 detach、merge/split 分区等新 DDL。文章给出了大量可直接使用的 SQL 示例和调参建议,并强调这些功能基于 beta,正式发布细节可能调整,升级后应结合 EXPLAIN (ANALYZE, BUFFERS, IO) 重新验证。

建议收录。它不是零散的版本新闻,而是把 Postgres 11 到 19 的功能演进与真实运维建议逐条对照,给出了从 COPY 容错、LZ4 压缩、BRIN 调优到分区在线操作的可执行路径。适合数据库管理员、后端工程师和依赖 PostgreSQL 的团队在升级前做功能核查与基准测试;文中先验证再调整的决策方式,也能迁移到其他数据库平台。注意文章内容基于 beta,部分行为需以正式版文档为准。

技术文章ClickHouse Engineering

What's New with Monitoring in PostgreSQL 19

文章梳理 PostgreSQL 19 的监控与可观测性改进:log_lock_waits 默认开启、log_min_messages 可按进程类型分级、autovacuum 与 autoanalyze 日志分离。pg_stat_wal 新增 wal_fpi_bytes 统计全页镜像字节数,并引入 CopyFromRead、CopyToWrite、WaitForWalWrite 等新等待事件。作者还解释 WAL 全页镜像为何主导 WAL 体积、multixact 膨胀如何判读,以及远程复制/FDW 消息统一格式化和回卷告警阈值提高到 1 亿的变化。文末给出面向日志解析、指标采集、等待事件字典与告警阈值的升级检查清单,但内容基于 beta 版,细节可能调整。

推荐收录,因为文章不仅罗列 PostgreSQL 19 的监控变更,还结合提交记录解释 WAL 全页镜像、multixact 膨胀等底层机制,并给出可执行的工具升级清单。适合数据库运维、SRE 与可观测性工具开发者在升级前排查兼容性风险;需注意内容基于 beta 版,最终以正式发行说明为准。

工程实践DuckDB Engineering Blog

Reconciling JSON in DuckDB, One Patch at a Time

本文是 DuckDB 工程博客的客座文章,介绍 DuckDB v2.0 JSON 扩展新增的四个标量函数:json_merge_patch_diff(计算 RFC 7396 merge patch 的逆)、json_deep_merge(null 表示跳过合并的递归合并)、json_normalize(递归排序键以生成规范形式)和 json_strip_nulls(递归删除 null 值键)。文章以 Atlan 的元数据同步场景为背景,展示这些函数如何组合成端到端的状态对账流程,用 SQL 单查询完成清洗事件、计算最小补丁、应用补丁和规范化哈希。作者在 50 万条合成 CDC 事件上对比了 Python 实现,DuckDB 获得 10 到 123 倍的加速,并说明性能来自 yyjson 原地操作和向量化执行。文章也明确了函数语义边界,如 SQL NULL 与 JSON null 的差异、数组元素顺序保留等。

推荐收录,因为这是一篇来自数据库核心团队的一手设计解读,包含函数语义、实现机制、组合用法和可复现基准,不是泛泛的功能介绍。对使用 DuckDB 做数据管道或 JSON 对账的工程师、数据库内核开发者都有直接借鉴价值,其 diff/merge/normalize/strip 的抽象也可迁移到其他数据处理系统。

工程实践PlanetScale Blog

Poisoned Postgres connection pools

文章介绍了连接池被“污染”导致 Postgres 集群出现只读错误的问题。作者以一次真实线上故障为例,说明当客户端通过 PgBouncer 事务模式复用底层连接时,如果某个请求执行了 SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY 或设置 default_transaction_read_only,随后离开连接池而未重置状态,就会让后续复用到该连接的查询错误地进入只读模式,并抛出 25006 错误。文中区分了连接池中毒与数据库集群只读、只读副本等不同错误特征,并给出了立即恢复手段 DISCARD ALL、通过 pscale 排查可疑会话,以及从应用侧避免设置会话级只读、改用副本路由或严格事务超时等预防措施。内容还提到 PlanetScale 的 MCP 编排工具可辅助定位代码中修改会话状态的路径。全文兼具具体故障现象、根因分析和可操作的恢复与预防方案。

推荐收录,因为它揭示了一个常见但容易被忽视的数据库连接池陷阱,从故障现象、根因到恢复和预防都有清晰说明,且不依赖特定框架。对使用 Postgres、PgBouncer 或任何事务模式连接池的工程师,文中关于会话状态泄漏、错误码识别和 DISCARD ALL 的处置方法可以直接迁移到实际系统中。

工程实践ClickHouse Engineering

Why strict memory overcommit matters for Postgres

文章解释 Linux 内存 overcommit 策略为何对 Postgres 格外关键:默认策略下 OOM killer 会 SIGKILL 某个 backend,而 Postgres 只能假设共享内存段可能已损坏,于是终止所有 backend 并走崩溃恢复,等于整个实例重启。严格 overcommit(vm.overcommit_memory=2)让内核在物理内存耗尽前就以 ENOMEM 拒绝分配,Postgres 将其视为普通错误,仅报错并回滚当前事务。作者在同一台 EC2(m7i.2xlarge)上用相同 pgbench 负载对比两种策略,并给出 commit limit 的推导:先扣除预留的 huge pages,再按剩余内存的 80% 加 2GB 作为 sidecar 头寸,约为总内存的 60% 加 2GB。实验显示默认策略下 20 个旁观连接全部被断开、新连接中断约 30 秒,严格策略下仅 1 个查询失败、0 个连接受影响,且两者吞吐差异落在噪声范围内。边界是结论基于单一硬件与特定 shared_buffers、huge pages 配置。

推荐收录:文章用同一台 EC2 上默认与严格 overcommit 的对照实验,给出 CommitLimit 推导依据、OOM 杀死 backend 后的崩溃恢复日志以及 pgbench 吞吐对比,证据完整而非泛泛而谈。适合负责 Postgres/Linux 生产部署的 DBA 与 SRE,可把内存耗尽的影响从实例级重启降为单查询失败;限额计算与验证方法也可迁移到其他数据库。风险是结论依赖单一硬件与 huge pages 配置,需按实际内存布局重新核算。

工程实践QuestDB Engineering

Read QWP: QuestDB's own binary wire protocol for ingestion and queries

QuestDB 10.0引入新的二进制列式线协议QWP,用于替代ILP(文本摄取)和PGWire(行式查询)的组合。文章介绍了QWP的设计动机:性能差距(QWP摄取19M行/秒,ILP仅5.3M;查询结果回传220M行/秒)以及单一客户端同时支持读写、DataFrame和Arrow双向传输、内置故障转移的需求。QWP在线上传输类型化列而非行,SYMBOL列字典编码,客户端将批量数据零拷贝映射到Arrow缓冲,但可空列、位压缩时间戳和zstd压缩仍需额外处理。文章还详细说明了多主机故障转移机制(服务器通告角色和区域,客户端路由至主或副本)、存储转发队列(支持磁盘持久化和重放)以及至少一次语义,建议在表上声明DEDUP UPSERT KEYS。作者对比了ILP/PGWire/REST的使用场景,并指出QWP适合新项目和自己编写的客户端,第三方工具仍应使用既有兼容协议。

这是一篇来自QuestDB官方工程博客的技术文章,提供了QWP协议的完整设计细节和基准数据,包括性能对比、柱式格式、Arrow集成、故障转移和存储转发机制,内容有实质深度而非单纯宣传。适合数据库内核开发者、时序数据库用户以及需要设计高性能数据摄入/查询协议的系统工程师阅读。文章中的协议取舍、迁移路径和客户端行为规范具有可迁移价值,但需注意官方立场可能对性能数字偏乐观,读者应结合自身场景验证。

技术文章DuckDB Engineering Blog

A Preview of DuckDB v2.0

DuckDB v2.0预览文章由核心开发者撰写,概述了即将发布的重大版本的主要特性。文章首先介绍了DuckDB作为服务器的新模式,通过Quack协议和CONNECT语句实现客户端/服务器架构,支持远程查询生产数据库。随后重点讲解了VARIANT类型的深化应用,使其能高效处理半结构化数据,并配合一系列variant_*函数。文章还介绍了触发器、丰富SQL方言(如NEAREST连接、CTE内DML、嵌套schema等)、全引擎异步I/O、大量查询性能优化(如重写递归CTE、聚合下推、分区感知规划)、新存储格式、全新PEG解析器,以及用自研实现替代ICU库带来的体积和性能优势。最后强调了稳定C API和自定义扩展仓库,使扩展编写和分发更加便捷。文章以预览形式呈现,强调细节可能在正式发布前调整,并提到部分破坏性变更。

本文是DuckDB官方工程博客的权威技术预览,内容详实,包含具体代码示例、性能基准和设计动机,展示了嵌入式数据库向客户端/服务器模式演进的关键架构决策。适合数据库内核工程师、数据分析平台开发者和对查询引擎优化感兴趣的读者。文中关于异步I/O、存储格式演进和扩展稳定ABI的设计思想具有可迁移性,但需注意各功能为预览状态,正式发布可能调整。

技术文章PlanetScale Blog

What is a data topology?

本文介绍 PlanetScale 分布式数据库 Neki 中的数据拓扑概念。数据拓扑是一个 JSON 配置,将 PostgreSQL 逻辑表映射到物理分片,并为路由器提供查询路由所需信息。文章详细解析其三个构建块:分片索引(支持 hash、modulo、range 三种策略)、分片组(物理分片集合与路由键范围)和数据库绑定(遵循 PostgreSQL 的 database/schema/table 层级)。通过一个按 customer_id 对 customers 表分片的示例,展示了路由键如何计算并落到对应分片。文章还指出数据拓扑不管理物理分片,并在 resharding、表迁移等过程中动态更新。该文是 Neki 内部架构的说明,适用于理解分布式数据库的分片与路由设计。

推荐收录,因为文章以清晰的结构解析了数据拓扑这一分布式数据库关键机制,且来自有大规模运维经验的实际团队,配置抽象与路由策略可迁移到其他分片系统。适合数据库架构师、分布式系统开发者和对 Vitess/PostgreSQL 分片感兴趣的读者。主要风险是内容偏向 Neki 特有实现,但核心概念与分类仍有长期参考价值。

工程实践The Consensus - Articles

The road to ACID transactions in Cassandra 6

文章在单机三节点 Cassandra 6.0 预发布集群上,用记账转账负载对比四种事务方案的 ACID 表现:默认覆盖写、BATCH、轻量级事务(LWT/Paxos)以及基于 EPaxos 的 Accord 事务。作者用并发测试工具 Monastery 构造盲写与读改写两类负载,并区分单分区与跨分区场景,通过第三个读线程实时校验两账户余额恒为 2000。结论显示:默认写常违反隔离性;BATCH 在单分区提供原子与隔离,但跨分区只保证最终原子应用、不保证隔离,且客户端时间戳相撞时会按单元格取较大值导致总和错误;LWT 能实现单分区严格可串行化的条件更新,但条件批次无法跨分区。Accord 通过 transactional_mode='full' 首次提供跨分区严格可串行化事务,但作者在单分区并发读中观测到余额不变量被破坏,随后被 Apple 工程师确认是真实 bug。文章边界在于使用本地无故障环境、事务为非交互式、Cassandra 6 尚未正式发布。

收录理由是它用可复现的三节点实验逐项验证 Cassandra 从 BATCH、LWT 到 Accord 的事务语义边界,并附带集群搭建脚本、CQL 负载与失败证据(时间戳并列取大、跨分区条件批次报错、Accord 隔离性 bug)。适合分布式数据库研发、存储与共识协议方向读者,可迁移价值在于理解原子性、隔离性、可串行化在不同机制下的取舍,以及如何设计并发不变量测试来发现真实缺陷。

技术文章Phil Eaton - databases

Writing a SQL database from scratch in Go: 1. SELECT, INSERT, CREATE and a REPL

本篇文章是“用 Go 从零写 SQL 数据库”系列的第一篇,目标是实现支持基本的 CREATE、INSERT、SELECT 命令和交互式 REPL 的最小数据库。作者从词法分析入手,设计 lexer 将输入转换为 token,依据 PostgreSQL 规则处理数字、字符串和标识符,并用 longestMatch 解决关键词前缀冲突;然后定义 AST 模型与递归下降解析器,分别解析三种语句。最后实现内存后端,用 map 存储表,以二进制表示 INT、字节串表示 TEXT,完成建表、插入和查询功能。文章给出完整代码与运行示例,并附测试,边界明确:仅支持单表基础操作,无持久化、事务和复杂表达式,适合初学者理解数据库与解析原理。

推荐收录,因为文章以可运行的 Go 代码完整展示了一个最小 SQL 数据库的词法分析、语法分析和内存执行流程,技术细节具体、步骤清晰,并配有测试样例与后续系列链接。适合想了解数据库内部机制、解析器实现或 Go 语言实践的中级读者,文中的 lexer/parser 组织方式和内存存储结构可直接迁移到其他小型解释器或教学项目。

技术文章Phil Eaton - databases

Writing a SQL database from scratch in Go: 2. binary expressions and WHERE filters

本文是《Writing a SQL database from scratch in Go》系列第二篇,在首篇基础上为 gosql 增加二进制表达式与 WHERE 过滤。作者扩展 AST 加入 binaryExpression,采用 Pratt parsing 处理运算符优先级和括号;重构内存后端,让每个表达式针对表行求值。求值器支持标识符、数字/字符串/布尔字面量以及算术、比较、逻辑等运算符,并明确不进行隐式类型转换。SELECT 语句新增 WHERE 条件逐行过滤,投影列可通过表达式计算,文中给出 REPL 交互示例。该实现目前只支持单表、简单运算符,并依赖内存存储,是教学性质的 SQL 引擎骨架,尚未涉及索引、连接等真实数据库特性。

推荐收录,因为文章完整展示了在 Go 中实现 SQL 解析与求值的过程,包含 Pratt 解析器、AST 设计、表达式求值和内存表数据流,且代码与解释同步。适合对数据库内核、编译原理或解释器实现感兴趣的读者,可作为手写 SQL 引擎的参考起点。其可迁移价值在于解析器优先级处理和行上下文求值框架可复用于其他小型语言或查询引擎,但需注意示例省略了类型强制转换、优化和持久化等生产特性。

技术文章Phil Eaton - databases

Writing a SQL database from scratch in Go: 3. indexes

文章在 gosql 项目中扩展索引支持,涵盖 PRIMARY KEY 词法解析、红黑树索引创建、插入时索引维护和 SELECT 查询优化。作者使用 GoLLRB 红黑树存储索引项,通过识别 WHERE 条件中可应用索引的模式,先用索引预筛选行再执行过滤。文章分析当前查询计划仅支持 AND 连接和列与字面量比较,不能合并范围条件,且索引并非总是优于线性扫描。基准测试显示 100 万行插入时带索引内存和耗时增加,但等值查询从秒级降至微秒级,体现空间换时间的权衡。

推荐收录,因为文章通过写一个 Go 语言 SQL 数据库的索引模块,完整展示主键约束解析、红黑树索引构建、插入维护和查询预筛选的端到端实现,并给出有/无索引的实测性能对比。适合想理解数据库索引原理、查询规划和存储引擎实现的读者;其简化取舍与限制分析也可作为进一步阅读真实数据库文档与源码的入门桥梁。

技术文章Phil Eaton - databases

Let's build a distributed Postgres proof of concept

本文通过约600行Go代码构建了一个分布式Postgres概念验证,解释了CockroachDB背后的核心组件:Postgres线协议、SQL解析、Raft共识和存储层。作者使用pgproto3、pg_query_go、Hashicorp Raft和bbolt,实现了CREATE TABLE、INSERT通过Raft复制到各节点,SELECT在任意节点本地执行。文章演示了多节点启动、通过HTTP手动加入集群、故障切换和重启后数据一致性。同时指出方案仅支持少量SQL、快照被禁用、日志重放效率低、JSON存储不高效,并且只实现了复制而非分片或跨分片事务。这个教程展示了如何将成熟库组合成可运行的分布式系统骨架,适合理解分布式数据库基础结构。

推荐收录,因为文章以可运行代码完整演示了分布式Postgres的核心机制:用Raft复制写操作、本地执行读操作,并明确说明了简化与局限。适合想理解CockroachDB等NewSQL系统底层组成或动手实现分布式数据库原型的读者。其将成熟库组合为可扩展骨架的思路、无快照设计取舍和故障切换验证过程具有可迁移价值,但需注意SQL支持和性能远非生产级。

技术文章Phil Eaton - databases

Extending gosql to supporting LIMIT and OFFSET

本文记录作者在 Go 实现的 SQL 数据库 gosql 中添加 LIMIT 和 OFFSET 支持的过程。作者首先更新词法分析器以识别两个新关键字,然后扩展 AST 结构并调整生成代码的辅助函数,使打印结果包含 LIMIT 和 OFFSET。接着,解析器在 SELECT 语句中识别这些子句并解析其后的表达式,同时将 LIMIT 和 OFFSET 作为 WHERE 表达式的边界分隔符。运行时内存后端会先计算 limit 和 offset 数值,然后在逐行过滤中跳过 offset 之前的行,并在超出 limit+offset 范围后停止。文章特别指出,LIMIT/OFFSET 仍需要扫描至少 offset 数量的行,不适合大数据集分页,应优先考虑基于索引的分页。该实现仅针对内存存储,未涉及其他后端或优化策略。

推荐收录,本文不是零散片段,而是完整展示了为 SQL 引擎添加 LIMIT/OFFSET 语法所需的词法、语法分析和运行时三个层次改动,并附有代码 diff 与运行验证。适合对数据库实现、编译前端或 Go 语言工程感兴趣的读者,其修改顺序和边界意识可迁移到类似扩展场景。风险是实现针对特定内存后端,未深入讨论一般化架构,但作为参考案例足够。

技术文章Phil Eaton - databases

Writing a document database from scratch in Go: Lucene-like filters and indexes

文章从零构建一个基于 Go 和 Pebble 的简易文档数据库,支持通过 HTTP 插入、按 ID 获取和搜索 JSON 文档,代码控制在 500 行以内。作者实现了一个简化版 Lucene 查询语言,包括带引号字段名/值、嵌套路径、相等和范围比较以及隐式 AND。为了加速等值查询,系统在独立索引库中存储“路径=值”到文档 ID 列表的映射,并在搜索时对多个等值条件取交集;基准测试显示 year=1918 的查询从约 1 秒降至 0.03 秒。文章明确指出现有实现不支持范围索引、全文搜索和数组字段,且索引存储采用逗号分隔的 ID 字符串,适合作为理解文档数据库基本原理的教学项目而非生产系统。

推荐收录:文章提供了可运行的 Go 实现,完整覆盖查询解析、路径求值、基于 Pebble 的存储和等值索引构建,并给出了索引前后的性能对比,具有清晰的动手教学价值。适合后端工程师、数据库初学者或希望理解 Lucene 风格查询和倒排索引简化模型的读者。可迁移价值在于展示如何用少量代码实现可扩展的键值查询与索引设计,同时明确标出范围查询、数组和全文搜索等未覆盖边界,避免误导。

技术文章Phil Eaton - databases

Writing a SQL database from scratch in Go: 4. a database/sql driver

文章是 Phil Eaton “从零用 Go 写 SQL 数据库”系列的第四篇,主题是让自制数据库 gosql 实现 Go 标准库 database/sql 驱动接口。作者展示了如何注册驱动、实现 Driver/Conn/Rows 等接口,以及如何将已有的解析、执行和结果处理逻辑封装到符合 database/sql 规范的 API 中。文中以具体代码说明 Open、Query、Next、Columns 等方法的实现要点,并明确指出当前版本不支持参数化查询、事务和预处理语句,仅处理第一条语句。最终通过一个使用标准 sql.Open 查询数据的示例验证了驱动的可用性。文章篇幅较短,重点在于解释接口契约与底层映射。

推荐收录,因为它以清晰代码展示了如何为自制数据库实现标准 database/sql 驱动,对理解 Go 数据库驱动接口的契约和低层数据流转有直接帮助。适合需要为自研存储系统提供标准 SQL 接入、或想学习 Go database/sql 内部机制的开发者。文章明确承认不支持参数化、事务和预处理,边界清楚,便于读者判断适用范围。

技术文章Phil Eaton - databases

Implementing the Raft distributed consensus protocol in Go

本文详细介绍用Go语言实现Raft分布式共识协议中领导者选举和日志复制两大核心组件,并构建其上分布式键值存储。作者从状态机与KV API入手,逐步实现持久化、RPC、选举超时、投票逻辑、日志复制与提交推进。文中强调按Raft论文图2建模状态,并给出二进制持久化优化、批量复制等工程取舍。实现约1000行,经过手动与压力测试,但未接入Jepsen,也未实现重配置和快照,且固定日志条目大小;作者明确声明不用于生产,仅用于学习。整体展示了从算法到可运行系统的完整路径,适合理解共识实现细节。

推荐收录,因为文章以完整Go代码和Raft论文为依据,系统讲解选举与日志复制,并明确给出测试情况与限制。适合想深入理解分布式共识实现、数据库复制或使用Raft库的工程师和研究者,可迁移用于实现类似协议或排查相关问题;主要风险是版本未经验证、缺少快照等生产特性。

技术文章Phil Eaton - databases

A minimal distributed key-value database with Hashicorp's Raft library

文章用单文件 Go 代码演示如何基于 Hashicorp Raft 库构建一个最小分布式键值数据库,约 260 行,通过 HTTP API 支持 set/get 和 join 操作。作者从 Raft 背景出发,逐步实现状态机(Apply、Restore、Snapshot 空实现)、节点初始化(BoltDB 日志存储、TCP 传输)和 HTTP 接口,其中 set 通过 Raft 日志复制,get 直接读本地内存但不保证强一致。文章最后给出可运行的完整示例,并提示未实现快照、不支持删除、节点需手动加入且仅用于学习。整体内容清晰展示了 Raft 库的集成流程与关键注意点,适合分布式系统入门参考。

推荐收录,因为文章以完整可运行的最小示例展示了 Hashicorp Raft 库的端到端集成路径,对理解 Raft 状态机、日志复制和集群管理具有直接帮助。适合分布式系统初学者或需要快速上手的开发者,其简洁实现可作为进一步实践和扩展的起点;同时文中明确指出了快照、读一致性和生产约束等简化点,避免了误用。

技术文章Phil Eaton - databases

How do databases execute expressions?

文章调查了 Cockroach、ClickHouse、DuckDB、PostgreSQL、SQLite、MySQL/MariaDB、MongoDB、TiDB 等系统如何执行查询表达式。作者通过阅读核心源码并以控制流函数为判断依据,区分了树遍历解释器、栈/寄存器虚拟机和 JIT 编译三类实现。结论显示多数数据库仍采用树遍历解释器,PostgreSQL 与 SQLite 使用虚拟机,MongoDB SBE 为栈式虚拟机,部分系统支持 JIT;ClickHouse、DuckDB、TiDB、Cockroach 还采用向量化执行。文章认为向量化和 JIT 更契合列存分析负载,事务系统迁移到编译器架构的收益未必显著;局限是结论来自源码阅读,可能存在误判且缺少性能基准。

本文通过大量数据库源码调查,给出了表达式执行模型的一手判断,具有长期技术索引价值。适合数据库内核开发者、查询引擎研究者以及想理解解释器与虚拟机差异的读者。其源码判断方法可直接迁移到其他系统,但需注意结论为静态阅读而非基准验证。

技术文章Phil Eaton - databases

Exploring PL/pgSQL part two: implementing a Forth-like interpreter

文章详细展示了如何在 PostgreSQL 的 PL/pgSQL 中从头实现一个类似 Forth 的栈式解释器。作者首先介绍 Forth 语言的基本概念,然后逐步实现数据栈、程序计数器、条件分支(IF/THEN)、内建指令(DUP、SWAP、算术运算等)以及函数定义(DEF)和调用(CALL)机制,并通过 hstore 扩展存储函数入口位置,使用返回指针栈处理嵌套调用。最终通过运行递归斐波那契函数验证了解释器的正确性。文章还指出了实现中的一些 PL/pgSQL 特性限制,如数组长度处理、NULL hstore 合并等问题。该实现仅为 Forth 的子集,未涉及完整 Forth 的诸多特性,但足以展示在受限的数据库过程语言中构造解释器的可行方法。

推荐收录,因为文章提供了一个完整可运行的 PL/pgSQL 解释器实现,包含逐步代码解释、设计取舍和实际运行验证,不是简单的语法介绍或新闻转述。适合对 PostgreSQL 内部过程语言、解释器构造或栈机器实现感兴趣的读者。其可迁移价值在于展示了在资源受限且语法特殊的嵌入式语言中实现编程语言核心机制的方法,对理解解释器原理和数据库编程均有启发,技术主题长期有效。

技术文章Phil Eaton - databases

A minimal RocksDB example with Zig

本文介绍用 Zig 编写一个最小 RocksDB 嵌入式键值数据库示例,封装 C API 实现 set、get 和基于前缀的 list 命令。作者先说明 RocksDB 以 C++ 编写但提供 C API,便于其他语言集成;随后逐步展示如何在 Zig 中用 @cImport 导入头文件,定义 RocksDB 包装结构,并调用 rocksdb_open、put、get 及迭代器接口。文中重点解释了 Zig 的类型系统和互操作细节,包括 error 类型缺陷、可选指针、C 字符串到切片的转换,以及匿名结构体在跨函数返回时的类型不兼容问题。最后给出 Linux 上的编译步骤、build.zig 配置和命令行运行结果。该示例仅适用于 Linux 与 Zig 0.10.x,RocksDB C API 文档不足,需参考头文件和测试代码。

文章提供了完整可运行的 Zig 调用 RocksDB C API 的最小示例,系统解释了 Zig 的错误处理、可选指针、C 字符串转换及构建配置,直接证据充分。适合希望学习系统编程语言与 C/C++ 库互操作、或集成嵌入式 KV 存储的开发者。可迁移价值在于 FFI 模式和 RocksDB 基础用法,但需注意 Zig 版本(0.10)与当前版本存在差异。

工程实践Phil Eaton - databases

Writing a minimal in-memory storage engine for MySQL/MariaDB

文章记录了作者在一周黑客活动中探索 MariaDB 内部机制并实现一个 218 行 C++ 的最小内存存储引擎的全过程。作者从构建调试版 MariaDB 开始,发现存储引擎插件必须放在源码树内而非独立仓,并实现了 handler 子类的 create、write_row、rnd_next、rnd_init 等关键方法。文中解释了 MySQL 的固定字节行格式和全局内存表结构,同时坦诚该引擎仅支持 INTEGER 字段、单数据库、非线程安全且不支持 NULL。作者还将 MySQL 与 Postgres 的存储引擎 API 进行对比,认为基于单行传递的设计限制了列存压缩和向量化的收益。最终通过 SQL 查询验证了引擎功能,并指出这类最小项目可作为探索其他存储后端的起点,适合作为学习数据库存储层原理的入门材料。

本文是难得的数据库存储引擎实战教程,作者以最小可行方式展示了如何从零接入 MariaDB 存储接口,代码完整且步骤清晰,并诚实标注了线程安全、数据类型等局限。适合对数据库内核、存储引擎或后端系统感兴趣的开发者阅读,可迁移价值在于理解存储引擎接口的设计约束以及如何快速验证自定义存储方案,同时避免被过度简化的示例误导。

工程实践Phil Eaton - databases

Go database driver overhead on insert-heavy workloads

文章针对 Go 语言中插入密集型数据库工作负载,对比 SQLite 和 PostgreSQL 的流行驱动与替代驱动的性能。作者使用统一基准:1000 万行、两种列数和数据大小,每个测试运行 10 次,记录中位数、标准差、最小/最大和吞吐量。结果表明,最流行的 SQLite 驱动 mattn/go-sqlite3 比作者维护的 gosqlite 慢约 20-40%;PostgreSQL 的 lib/pq 比 pgx(绕过 database/sql)慢约 44-76%,且 lib/pq 已停止开发。作者推测 database/sql 接口可能是开销来源之一,但未完全证明。对于小结果集查询,驱动间差异不大。结论是建议 Go 开发者在插入密集型场景中自行基准测试驱动,并优先考虑 pgx。

推荐收录,因为文章提供了可复现的、具体数据支撑的驱动性能对比,直接指导 Go 开发者在批量插入场景下的技术选型。文章不仅给出结论,还公开了基准测试方法和代码仓库,便于读者验证和扩展。适合后端工程师、数据库应用开发者参考,可迁移价值在于提醒性能敏感场景避免盲从默认驱动,且需关注 database/sql 接口的潜在开销。

技术文章Phil Eaton - databases

Writing a SQL database, take two: Zig and RocksDB

文章展示了如何在 Zig 语言中用约 1700 行代码实现一个基于 RocksDB 的嵌入式 SQL 数据库。作者将项目拆分为词法分析、语法分析、存储层和执行层,详细讲解了每个组件的设计,包括手写 lexer/parser 支持 SELECT、INSERT、CREATE TABLE 等语句,以及如何用 RocksDB 持久化表元数据和行数据。文中还介绍了 Zig 的内存管理(Arena allocator)、数据序列化方案和表达式求值。该实现仅支持极小的 SQL 子集,无主键、事务和索引,主要用于学习数据库内部原理和 Zig/RocksDB 的实践,而非生产用途。

推荐收录,因为文章提供了完整可运行的代码实现和逐步讲解,清晰展示了从 SQL 解析到键值存储映射的完整流程。适合对数据库内部实现、Zig 语言或 RocksDB 感兴趣的开发者阅读,可迁移价值在于理解手写 lexer/parser 的实践、内存管理策略以及嵌入式数据库的架构设计。主要风险是项目功能有限,但作为教学参考具有长期价值。

技术文章Phil Eaton - databases

What's the big deal about key-value databases like FoundationDB and RocksDB?

文章系统介绍键值数据库(嵌入式如 RocksDB、LevelDB、PebbleDB,分布式如 FoundationDB、TiKV)在当代数据库系统中的重要性。作者从数据库可扩展性切入,解释存储引擎可替换如何帮助优化分析型或写密集型负载,并详细说明将 SQL 行映射为键值对的具体编码方法,包括表标识、主键和行标识组合及高效前缀扫描。文章梳理了可靠存储、嵌入式部署、高效前缀扫描等关键特性,并列举构建在这些存储上的多种数据库实例。最后区分了嵌入式与分布式键值数据库的架构差异,并指出非数据库开发者或非大规模场景可忽略存储层细节。

推荐收录,因为文章清晰梳理了键值存储在现代数据库架构中的核心作用,提供了 SQL 到 KV 映射的具体思路和真实数据库案例,适合想理解数据库存储层或构建数据库系统的开发者。它作为入门导览具有较好的长期参考价值,能帮助读者建立对存储引擎选型和架构分层的整体认知。

技术文章Phil Eaton - databases

Exploring PL/pgSQL: Strings, arrays, recursion, and parsing JSON

本文是一篇面向 PL/pgSQL 初学者的实践教程,从基础函数定义、命名参数、OUT 参数和递归函数入手,逐步过渡到字符串与数组操作、自定义复合类型,最终实现一个能解析 JSON 对象子集的词法分析器和语法解析器。作者强调目标不是生产级代码,而是熟悉语言特性,因此明确排除了嵌套对象、数组、Unicode 和小数等复杂场景。文中给出了完整可运行代码、测试脚本和错误处理示例,展示了如何利用 PL/pgSQL 的内置 SQL 函数、数组操作和自定义类型完成命令式编程任务。

推荐收录,因为文章不是简单罗列语法,而是通过实现字符串转数组、递归斐波那契和 JSON 解析器三个递进式例子,让读者理解 PL/pgSQL 的函数声明、控制流、复合类型和错误处理机制。对需要在 PostgreSQL 中编写存储过程、触发器或复杂业务逻辑的开发者来说,文中的代码模式和调试方法具有直接参考价值,且作者对语言边界和适用场景的说明清晰克制。

个人心得Phil Eaton - databases

First month on a database team

作者记录了自己加入 EnterpriseDB 分布式 Postgres 团队第一个月的 onboarding 经验。他提出先避开困难的人员、组织与流程问题,利用初期 sprint 自由度专注于构建、测试、运行和文档等可独立完成的任务。具体策略包括收集构建过程写内部博客,尝试静态/动态分析,探索测试覆盖率受阻后转向学习测试框架并撰写测试指南,将 quickstart 迁移到集成测试框架,编写启动本地集群的脚本,以及通过阅读文档和提出“笨问题”加深理解。他还建议将个人笔记开放为团队文档,并尝试绘制架构图。文章强调精确记录必要步骤与试错路径、公开分享学习成果、以及在团队频道中提问的价值。该方法适用于开发者快速上手复杂系统,但主要提供个人经验,尚未涉及深层技术细节。

推荐收录:作者以数据库团队新人视角,清晰展示了从构建、测试到文档的系统性 onboarding 路径,并提供了具体可操作的做法,如写内部博客沉淀知识、将 quickstart 移植为测试、用“笨问题”推动团队理解。适合即将加入新团队或需要快速熟悉复杂代码库的工程师,其方法可迁移到其他基础设施或后端项目。主要风险是内容偏个人经验,技术细节有限,但作为职业成长与工程实践反思仍具长期参考价值。

技术文章Phil Eaton - databases

Exploring a Postgres query plan

文章记录作者在探索 Postgres 查询执行钩子时的学习过程,目标是从 QueryDesc 计划对象重建原始 SQL 字符串。作者搭建了带共享库的调试环境,通过 ExecutorRun_hook 拦截查询,并逐步解释 Plan 节点、范围表、OpExpr、Const、Var 等关键结构。文中给出完整 C 扩展代码,示范如何查找关系名、操作符名和列名。最终实现对简单 SELECT 的 SQL 重建,验证了 a > 1、a + 1 和常数比较等场景。该方法仅覆盖顺序扫描、整型常量与基础 Vars,尚未处理连接、聚合、子查询和别名等复杂计划,且依赖特定版本 Postgres 内部 API。

推荐收录,因为这是一篇可复现的数据库内核级工程笔记,而非泛泛介绍:作者提供了完整 hook 代码、构建方式,并逐步验证从计划树重建 SQL 的能力。适合数据库内核、Postgres 扩展开发者以及对查询计划内部表示感兴趣的后端工程师。其可迁移价值在于展示如何遍历计划节点、解析表达式并访问系统目录,但注意依赖特定版本内部 API,升级时可能变化。

技术文章Phil Eaton - databases

Writing a storage engine for Postgres: an in-memory Table Access Method

文章围绕Postgres 12引入的可插拔表访问方法(Table Access Method)API,通过实现一个内存存储引擎原型系统介绍了其工作机制。作者从Postgres调试构建和扩展基础设施开始,逐步探索TableAmRoutine结构体中必需的回调函数,通过日志和断言定位到slot_callbacks、scan_begin、getnextslot等关键方法。文章详细记录了如何在C扩展中管理表结构、存储行数据、处理插入和扫描,并解决slot填充、扫描状态管理等实际问题。最终原型支持创建内存表、插入整数和执行简单SQL查询,展示了复用Postgres上层SQL、协议和生态的潜力。作者明确说明这是原型质量代码,尚未实现索引、删除、更新等完整功能,适合作为进一步探索的基础。

推荐收录,因为文章填补了Postgres表访问方法缺乏最小实现教程的空白,以逐层调试和可运行代码展示了从扩展骨架到内存存储引擎的完整过程。适合数据库内核开发者、Postgres扩展作者和想理解可插拔存储引擎的读者,文中的调试方法、API使用陷阱和原型边界具有直接参考价值。

技术文章Phil Eaton - databases

An intuition for distributed consensus in OLTP systems

文章旨在建立对OLTP系统中分布式共识(尤其是Raft算法)的直觉。作者先解释Raft的基本机制:领导者选举、日志复制、提交和跟随者追赶,然后阐明分布式共识通过副本提供高可用和线性一致性,同时强调其本身并不提供水平扩展,水平扩展需通过分片实现。文章讨论了添加节点对延迟和可用性的权衡,并列举了实际优化技术,包括快照、批处理、磁盘/网络优化和灵活法定人数。此外还涉及安全与测试方法,如Jepsen、确定性测试和TLA+规格验证。最后指出共识开销大,应根据一致性需求选择合适方案。文章主要适用于OLTP系统,未深入非OLTP共识算法或具体实现细节。

推荐收录,因为文章用简洁直观的方式梳理了Raft在OLTP系统中的运作机制,并纠正了分布式共识常被误解为水平扩展的问题。作者从线性一致性、可用性、节点扩展、优化和测试等多个角度展开,既有理论直觉也有工程实践视角,适合分布式系统初学者和数据库工程师建立基础框架,同时为进阶读者提供了丰富的进一步阅读线索。

技术文章Phil Eaton - databases

A write-ahead log is not a universal part of durability

文章围绕持久性与预写日志(WAL)展开,作者通过伪代码逐步演示:内存数据库先写全量 B 树到磁盘并 fsync,虽然可实现持久性但效率很低;随后引入 group commit 摊销 fsync 成本,但每次仍写全量结构。作者指出更优做法是先写客户端请求到只追加日志并 fsync,即可安全返回,主数据结构延迟写入,启动时重放日志,这就是 WAL。文章还讨论了 fsync 失败处理、磁盘/文件系统损坏时 checksum 的作用、CDC 与 WAL 的关系,并强调多数数据库默认配置在安全与性能间权衡。最后总结持久性首先取决于向客户端返回成功前是否已落盘,WAL 是低成本实现手段。文章以浅显代码示例搭建直觉,适合理解存储持久性机制,但不涉及具体数据库生产实现细节。

推荐收录,因为文章以清晰的伪代码推演解释了 WAL 并非持久性唯一手段,而是针对全量写盘低效的优化方案。它把 fsync、group commit、checksum 和日志重放等概念串联起来,有助于读者建立数据库持久性的正确心智模型。适合后端工程师、数据库学习者和对存储系统感兴趣的人阅读。需要注意的是,文中为教学目的做了简化,不能直接等同于生产级实现。

技术文章Phil Eaton - databases

Implementing MVCC and major SQL transaction isolation levels

文章用约 400 行 Go 代码实现了一个内存键值数据库,并基于 MVCC 和乐观并发控制支持五种 SQL 事务隔离级别:读未提交、读已提交、可重复读、快照隔离和可串行化。作者从多版本数据结构和可见性规则开始,逐步实现不同隔离级别下的读写逻辑,并通过读写集合在提交时进行写-写冲突或读-写冲突检测。文中用带注释的测试展示并发事务行为差异,同时讨论真空清理、版本存储放大等现实约束,并指出教学实现的局限,如未处理范围查询、子事务和保存点。

推荐收录,因为它以可运行的最小实现和测试清晰地解释了数据库事务隔离级别的核心机制,而非停留在概念罗列。适合数据库初学者、后端工程师或需要理解事务可见性和并发异常的读者;文中展示的版本可见性规则和冲突检测思路可以迁移到实际数据库选型与事务调试中。主要局限是教学简化,未覆盖生产级范围查询等细节。

技术文章Phil Eaton - databases

Build a serverless ACID database with this one neat trick (atomic PutIfAbsent)

文章以 Delta Lake 论文和协议为蓝本,用约 500 行 Go 零依赖代码实现了一个受 Delta Lake 启发的 serverless ACID 数据库。核心是利用对象存储的原子 putIfAbsent 语义,通过不可变数据文件和带事务 ID 的元数据日志实现快照隔离。文中详细演示了基于 POSIX link 的文件系统原子写入、事务动作、内存行缓冲、数据对象刷新和扫描迭代器,并用两个并发测试验证写冲突与读快照行为。作者明确指出该实现仅支持建表、插入和全表扫描,未覆盖更新、删除、日志 checkpoint、压实等,且合并所有表的事务日志比 Delta Lake 更严格,带来更高写冲突。

推荐收录,因为文章不是泛泛介绍,而是给出了从对象存储原语到事务提交的完整可运行实现,并通过测试展示了并发读写的实际行为。适合想理解 Delta Lake、Iceberg 类事务机制或实现对象存储上最小 ACID 数据库的读者,其抽象接口和原子提交思路可直接迁移到教学或原型系统。主要边界是省略了更新删除等生产特性,单写者模型也限制了并发写能力。

技术文章Phil Eaton - databases

Transactions are a protocol

文章提出事务并非存储系统的固有属性,而是一种可以在任意存储系统上实现的协议。作者引用 Delta Lake、Orleans 在云存储上实现事务,以及 Epoxy 在 Redis 等系统上提供事务的方案,并提到两阶段提交作为经典例子。文章进一步指出,即使 PostgreSQL、MySQL、SQLite 已内置事务,开发者也可以选择绕开并实现自己的事务层,如 Convex 所做。作者认为,在需要一致性、原子性和隔离性,尤其是跨数据系统构建应用时,应把事务协议视为系统设计工具箱中的一种工具。文章以观点阐述和文献导引为主,未深入实现细节与性能评估。

这篇短文以清晰的视角将事务定义为可移植协议,串联了多个数据库系统的实现案例,适合需要理解跨存储系统一致性或设计事务层的读者。其价值在于提供思维框架和进一步阅读线索,但内容较为概略,应作为入门索引而非实现参考。

技术文章Phil Eaton - databases

Things that go wrong with disk IO

本文围绕磁盘 I/O 中可能导致数据丢失或损坏的场景展开,涵盖写入未达磁盘、fsync 失败、数据损坏、部分写入、假写、误写/误读等。作者基于 Parity Lost and Parity Regained 与 Characteristics, Impact, and Tolerance of Partial Disk Failures 两篇论文,解释了 buffered I/O 下 fsync 的必要性及其不可靠性,并介绍校验和、原子写、O_DIRECT 等缓解措施。文中对比了 Postgres、SQLite、MySQL、MongoDB、RocksDB 等系统在持久化、校验和与撕裂写处理上的默认行为,指出部分系统默认开启校验和,部分未开启,且假写和误写/误读常被忽视。文章限定于 Linux 环境,强调不同文件系统与磁盘的扇区大小差异,适合需要理解存储可靠性边界的开发者和数据库工程师。

本文以具体故障场景为线索,结合真实数据库系统的默认行为,清晰解释了磁盘 I/O 中容易被忽视的可靠性问题,如 fsync 失败、撕裂写和假写。适合需要设计或维护持久化系统的工程师,尤其是数据库与存储系统开发者。其价值在于将零散的 I/O 风险系统化,帮助读者在事务性场景中做出更稳妥的 fsync、校验和与原子写决策。

工程实践LinkedIn Engineering - Architecture

Rebuilding messaging: How we bootstrapped our platform

文章复盘 LinkedIn 重建消息平台时的存量数据迁移过程。旧系统单体且数据非规范化,共享内容与个人元数据冗余存储;新系统改为规范化微服务,将共享消息与个人元数据分离。迁移采用三阶段方案:先双写实时复制新写入,再通过确定性 UUID v5 生成新旧 ID 映射,最后对 17 年快照做 Hadoop ETL、变换和批量上传。文章重点介绍了阴影验证机制、基于 If-Unmodified-Since 避免覆盖在线更新,以及表索引数量影响上传吞吐等经验。整体展示了大规模在线数据迁移中可迁移的架构权衡与实施细节。

推荐收录:文章提供了 LinkedIn 超大规模消息系统数据迁移的完整工程案例,包含三阶段方案、双写一致性、离线变换与阴影验证等具体实践。对负责数据库迁移、分布式一致性和后端架构的读者具有直接参考价值,尤其展示了复杂在线系统零停机迁移的可操作方法。

工程实践LinkedIn Engineering - Scalability

How LIquid Connects Everything So Our Members Can Do Anything

本文介绍 LinkedIn 自研图数据库 LIquid 如何支撑其经济图谱(2700 亿条边、200 万 QPS)的实时访问。文章以 People You May Know 功能为例,说明从遗留系统 GAIA 迁移到 LIquid 的架构:用声明式 Datalog 查询做图遍历,再由 Venice 和 Pinot 提供特征与排序。迁移后 QPS 从 120 提升到 18000,延迟降到平均 50ms 以下,CPU 降低 3 倍以上,并支持更细粒度、可解释的推荐和快速 A/B 实验。作者也指出当前同质化架构在数据规模扩大时的低效问题,以及未来分层存储与工作负载优化的方向。

文章以真实生产系统为例,提供了从离线批量到实时图查询的完整迁移路径和可量化性能结果,证据具体、架构清晰。适合关注大规模图数据库、实时推荐或高并发基础设施的工程师借鉴,其关于声明式查询、索引优化和成本控制的方法具有跨团队可迁移价值。

工程实践SelectDB 技术分享

97% 召回率、900 QPS:Apache Doris 4.1 生产级向量检索的工程实践 针对大模型应用中专用向量库成本高、混合查询难的痛点,本文深入拆解 Apache Doris 4.1 原生...

文章针对大模型应用中专用向量库成本高、混合查询难的问题,深入剖析 Apache Doris 4.1 原生向量检索的工程设计。作者先比较专用向量数据库、关系型数据库扩展和分析型数据库原生支持三条路径,论证原生集成路线的优势。随后详细阐述 IVF 索引降低内存、IVF_ON_DISK 冷热分层、SQ/PQ 量化压缩以及 ANN Index Only Scan 优化查询性能的具体实现和 DDL 示例。文章还演示了结构化过滤联合查询与基于 RRF 的多路召回融合在 SQL 中的落地方式,并给出 VectorDBBench 基准数据。测试表明该方案在 100 万 768 维向量上取得 900 QPS、97% 召回率,构建速度最快,形成成本与性能的均衡。不过文中基准硬件规格不一,实际部署需根据工作负载进行验证。

推荐收录,因为文章不是简单的功能罗列,而是系统拆解了 Doris 4.1 向量检索的工程实现,包括 IVF 降本、磁盘索引、量化压缩、Index Only Scan 等关键设计,并提供了混合检索的 SQL 实现和基准数据。适合数据库内核、AI 基础设施和 RAG 系统开发者参考,其存储分层、覆盖索引和融合排序思路可迁移到其他 OLAP 或向量检索场景。需注意部分内容来自厂商,基准配置存在差异,应结合自身负载验证。

技术文章SelectDB 技术分享

强行拍平?全表扫描? AI Agent 动态 JSON 的观测分析 如何保留 JSON 灵活性的同时,获得列式存储的查询性能? Apache Doris 2026/5/12

本文从 AI Agent 日志观测场景切入,指出 Agent 执行流具有嵌套数组、动态 Schema 和非确定性推理等特点,传统扁平日志模型无法还原完整执行树,而全量拍平会破坏上下文关系并导致频繁 DDL,直接存为 String 又会造成全表扫描和 JSON 解析性能瓶颈。作者提出让数据库原生支持半结构化数据,以 Apache Doris/SelectDB 的 VARIANT 类型为例,解释自动子列提取如何保留列式扫描性能和压缩率,倒排索引如何加速长文本和 JSON 内部关键字检索。文章进一步给出动静分离的混合建模实践:高频标量字段用标准列,动态嵌套对象用 VARIANT 列,关键排障字段建立倒排索引,并附建表与查询示例。内容主要基于 Doris/SelectDB 引擎,未提供跨引擎量化对比,但方案思路可迁移到 ClickHouse JSON 类型等类似系统。

推荐收录,因为文章直面 AI Agent 日志观测中 JSON 处理的核心矛盾,清晰对比了全量拍平、String 存储与半结构化原生支持三条路线的优劣,并提供可落地的混合建模 DDL/DML 示例。适合负责可观测性平台、日志分析或 OLAP 数据建模的工程师参考,其动静分离、自动子列提取与倒排索引组合的设计方法可以迁移到其他支持半结构化类型的列式数据库。

工程实践SelectDB 技术分享

时间序列近邻关联性能实测:Doris ASOF JOIN 领先 ClickHouse、DuckDB Doris 在 4.0.5 和 4.1.0 版本引入的 ASOF JOIN,把时间序列近邻关联做成一个能在大规模、...

文章对 Apache Doris 4.0.5/4.1.0 引入的 ASOF JOIN 进行系统性能实测,该功能面向时间序列近邻关联,可在按业务键分组后找到不晚于左侧记录的最近右侧记录,适用于交易行情补全、事件归因等场景。测试设计覆盖大小表组合、1 亿行对 1 亿行、不同 NDV、长序列、短序列、乱序存储和过滤条件等六大类典型场景,并与 ClickHouse、DuckDB 在相同硬件和并发参数下对比。结果显示 Doris 在绝大多数用例中显著领先,例如大小表 JOIN 低至 0.15-0.38 秒,1 亿对 1 亿约 0.97-1.13 秒,短序列和乱序场景优势更明显。文章强调该实现具有低延迟和高稳定性,适合大规模、复杂分布的真实业务。需注意内容来自 SelectDB 官方技术团队,测试带有厂商视角,但其测试设计和场景覆盖可作为数据库选型与性能评估参考。

推荐收录,因为文章提供了 ASOF JOIN 系统化的性能基准测试,从测试设计、环境配置到多维度场景结果均有详细说明,对需要处理时间序列近邻关联的数据库工程师和架构师有直接参考价值。其可迁移价值在于展示了如何设计覆盖真实业务复杂度的数据库功能基准测试,但需注意来源为厂商官方,数据结论应结合独立验证或实际业务场景再判断。

工程实践SelectDB 技术分享

秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率 阿里云 SelectDB Serverless 可实现资源按需供给与按使用量计费,在负载高峰时补齐资源,...

文章讨论云数仓资源管理中长期存在的矛盾:业务负载波动大,固定规格资源常按峰值锁定,导致平均利用率低;传统存算分离架构弹性慢,扩容伴随缓存预热和数据重分布,容易引发查询延迟抖动。作者提出 SelectDB Serverless 的解决方案,通过计算、缓存、存储三层独立解耦,支持秒级原地纵向伸缩,单集群最高16倍弹性区间,并采用“扩快缩慢”策略——CPU 5秒均值或内存瞬时利用率超过60%触发扩容,CPU与内存同时低于30%且持续1分钟才渐进缩容,同时引入AI辅助决策。文章还给出选型参考:峰谷特征明显、可释放计算资源超过28%时Serverless才具成本优势;纵向弹性有16倍边界,极端场景需横向伸缩约3分钟。内容主要基于产品设计与机制说明,缺少独立用户验证数据。

推荐收录,因为它不只是产品宣传,而是提供了具体的弹性架构设计:三层资源解耦、扩缩容触发阈值、原地纵向伸缩机制和选型成本阈值,对云数仓、Serverless 或弹性架构设计的读者有直接参考价值。可迁移的是“扩快缩慢”的弹性策略和计算/缓存/存储解耦思路;需注意其厂商视角,部分性能数据未经独立验证。

技术文章SelectDB 技术分享

Apache Doris 在 AgentLogsBench 中领先,支撑 Agent 可观测性生产负载 Agent 可观测性需要一种能够统一承载多种访问模式的新型系统能力 Apache Doris可观测性与...

文章分析了 AI Agent 生产环境中可观测性负载的新特点:文本主体大且无结构、关键字段高度动态、trace 有序嵌套、看板需与持续写入并存。作者指出传统搜索、OLAP、文档库难以单独胜任,需要统一混合负载数据系统。AgentLogsBench 用单表 1 亿行 observation 数据评测六种引擎,覆盖 trace 回放、短语搜索、动态 JSON 过滤和实时聚合。结果显示 Apache Doris 综合 slowdown 1.28 领先,hot/cold 均第一,但在长文本 cold phrase search 上仍落后 Elasticsearch。文章解释了 Doris 领先原因包括倒排索引、VARIANT 子列、按 trace_id 分布与排序键、分区裁剪和缓存机制。该文可作为选型或理解混合负载数据系统的参考,但数据来自合成 benchmark,结果需结合实际验证。

推荐收录,因为文章不是空泛宣传,而是给出了 Agent 可观测性基准的具体设计、完整查询负载和跨系统实测数据,并逐项解释 Doris 架构优化如何影响性能。适合从事可观测性、OLAP 或 AI 平台基础设施的读者,用于理解混合负载系统选型与优化。可迁移价值在于把文本搜索、动态 JSON、trace 回放和实时聚合放在同一存储上权衡;主要风险是来自 SelectDB 官方且数据为合成,需结合其他评测交叉验证。

技术文章SelectDB 技术分享

Apache Doris 4.1 全面增强 Iceberg:支持 UPDATE、MERGE INTO 与 Iceberg V3 在已有查询能力的基础上,Doris 进一步支持了 UPDATE、DELETE、MERGE INTO 等数据...

本文介绍 Apache Doris 4.1 对 Iceberg 的能力扩展,从仅支持查询扩大到 UPDATE、DELETE、MERGE INTO 等 DML、表结构管理与日常维护,并完整支持 Iceberg V3。文章重点解析 Deletion Vector 机制:V3 用位图记录失效行并写入 Puffin 文件,使删除文件数量与数据文件同阶,文中测试显示文件数从336降至17、删除信息存储从98MiB降至3.8MiB、高删除比例查询时间降至约1/3。同时介绍 Row Lineage 提供的 _row_id 和 _last_updated_sequence_number 系统列,用于稳定行标识和增量变化识别,可配合 Time Travel 定位记录。作者也说明这些能力仅适用于 format-version=3 且需 Doris 4.1+,收益受数据规模和文件布局影响,Row Lineage 不等同审计系统。文章最后给出五分钟入门步骤并展望 Variant 读写和增量物化视图。

推荐收录,因为文章不是单纯的产品发布,而是提供了 Iceberg V3 关键机制(Deletion Vector、Row Lineage)的清晰解释、具体 SQL 示例和量化测试结果,并明确标注了版本、格式和场景边界。适合从事湖仓一体、Doris 或 Iceberg 数据管线的工程师理解如何在 OLAP 引擎中收敛查询、修改和维护,其关于减少删除文件开销和行级增量识别的思路具有可迁移价值。

工程实践SelectDB 技术分享

Apache Doris 倒排索引工作原理:全文检索提速 59 倍,点查提速 14 倍 我们基于开源分析型数据库 Apache Doris,针对包含 1.35 亿条数据的亚马逊评论数据集进行...

文章介绍 Apache Doris 内置倒排索引解决 OLAP 稀疏扫描问题的技术机制与实测效果。针对传统 OLAP 依赖列存、排序和 Zone Maps 在稀疏查询下全表扫描的局限,文章详细解析了三种索引结构:字符串精确匹配用 Posting List,数值范围过滤用 BKD 树,非结构化文本检索用分词器结合倒排列表。在 1.35 亿条亚马逊评论数据集上,50 并发测试显示全文检索提速 59 倍,按 ID 点查提速 156 倍,多维组合查询提速 10 倍。同时评估了资源开销:新增 7 个索引后存储从 26GB 增至 47GB,写入耗时增加约 6%,主要来自大文本列。结论认为 OLAP 内置倒排索引可简化 Elasticsearch+OLAP 双引擎架构,但应根据查询特征选择性建索引以控制成本。

推荐收录,因为文章基于 1.35 亿条真实数据给出可复现的建表、索引和查询测试,定量对比了性能提升与存储/写入开销。适合数据库内核开发者、 OLAP 架构师和数据平台团队参考,其倒排索引设计思路可迁移到类似分析型系统或评估 Elasticsearch 替代方案。需要注意的是测试仅基于单节点和特定数据集,索引列选择需按业务权衡。

技术文章SelectDB 技术分享

宽表元数据膨胀怎么解?Doris Segment V3 对比 Parquet、Lance 要让查询真正只为目标列付出元数据成本,思路无非有三种:让 Footer 更容易定位,把重型列元数据...

文章围绕宽表场景下 Footer 元数据膨胀问题展开,对比 Parquet、Lance 与 Doris Segment V3 的解决思路。作者首先指出列式存储中 Footer 会随列数和 Row Group 增长,在数千列、复杂 JSON/Variant 子列时可达数 MB 甚至数十 MB,拖慢查询启动与元数据解析。随后分析三种格式的约束:Parquet 受生态兼容限制,通过 FlatBuffer 随机访问、裁剪冗余和兼容扩展降低开销;Lance 从文件结构重设计,将列元数据独立存储并放弃传统 Row Group;Doris 则在保留 OLAP 能力前提下,将每列 ColumnMetaPB 外置到独立 Column Meta Region(CMR),并在 Footer 中仅保留轻量目录,同时为 Variant 增加路径索引。性能测试显示极端宽表下 Segment 打开时间从 65 秒降至 4 秒,内存从 60 GB 降至不足 1 GB。适用边界是数千列宽表、复杂 Variant 和大量 Segment 场景,窄表收益有限。

推荐收录,因为文章对列式存储元数据膨胀问题提供了清晰的问题拆解和三种主流格式的取舍对比,并详细说明了 Doris Segment V3 的 CMR 外置、Variant 路径索引以及性能验证数据。适合数据库内核、存储引擎、数据仓库以及对宽表/半结构化数据查询优化感兴趣的工程师阅读。可迁移价值在于理解文件格式设计中的兼容性、功能完整性与查询性能之间的权衡;主要风险是内容带有 Apache Doris 厂商视角,但对 Parquet 和 Lance 的分析仍较客观。

技术文章SelectDB 技术分享

Agent 场景动态 JSON 性能拆解:Apache Doris 比 ClickHouse 快 7 倍、比 Elasticsearch 快 2 倍 为什么同样都支持 JSON,不同数据库在 Agent 日志场景下的性能...

文章围绕 Agent 日志中动态 JSON payload 的性能挑战展开,基于 AgentLogsBench 基准测试对比了 Apache Doris、ClickHouse、Elasticsearch/OpenSearch 和 DuckDB/Parquet Variant。作者剖析了 Doris VARIANT 将常用 JSON Path 转化为列式 subcolumns 的机制,并通过高频路径列式化、低频路径 sparse columns 和 Storage Format V3 来优化宽 JSON 查询。测试显示 Doris 在动态字段聚合、rollup 和低基数过滤上延迟优势明显,平均比 ClickHouse 快 7.4 倍,比 Elasticsearch 快 2.4 倍,存储占用接近 ClickHouse 且远低于 Elasticsearch。文章还分析了其他系统的取舍,如 Elasticsearch 搜索强但动态聚合成本高、ClickHouse 压缩好但长尾路径查询慢、DuckDB/Parquet Variant 开放格式强但在线分析不足。结论指出,将动态 JSON 纳入列式存储、索引和向量化执行链路是决定搜索后分析体验的关键。边界在于结果来自厂商基准,可能带有一定倾向性,但技术原理和权衡分析具有参考价值。

推荐收录。文章不仅给出了性能对比数据,还深入解释了 Doris VARIANT 的 subcolumnization、Storage Format V3 机制,并对比了 ClickHouse、Elasticsearch、DuckDB/Parquet Variant 的架构取舍,技术细节和可迁移性强。适合数据库内核、OLAP、可观测性和大数据工程师理解动态 JSON 在不同系统中的处理方式,为 Agent 日志分析、技术选型和优化提供依据。尽管来自商业公司,但内容以基准和原理为主,推广成分较低,长期参考价值较高。

技术文章SelectDB 技术分享

Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑 Doris Python UDF 提供的不只是一个函数扩展机制,而是一条连接 Doris 高...

文章系统介绍 Apache Doris 的 Python UDF 功能,旨在让 SQL 直接调用 Python 生态以应对 AI 和实时分析中日益复杂的业务逻辑。核心方法是通过 Arrow RecordBatch 批量传输数据到独立 Python Server 执行,并支持 Pandas Series 向量化计算,减少跨语言和跨进程开销。Doris Python UDF 完整支持标量 UDF、UDAF 和 UDTF,提供内联与 ZIP 模块化加载方式,并内置进程隔离、复用和自愈机制以保证生产环境稳定性。文中给出支付风险分级和金额分桶等示例,展示在数据不离开分析链路的情况下完成规则判断、特征加工和模型打分。该能力已在 SelectDB 商业化产品中提供,适合需要将 Python 逻辑嵌入实时分析查询的场景,但部署前需在所有 BE 节点配置 Python 环境并安装 pandas/pyarrow。

本文对 Doris Python UDF 的设计机制、使用方式和生产化保障做了完整阐述,包含 Arrow 批量执行、向量化优化和故障恢复等关键细节,而非泛泛介绍。适合数据库内核开发者、数据工程师和需要在 SQL 引擎中集成 Python 生态的读者,可迁移到其他分析型数据库的扩展机制设计,帮助理解如何平衡灵活性、性能与可运维性。

技术文章SelectDB 技术分享

Apache Doris 4.1 Spill to Disk:避免运行内存密集型查询发生 OOM Apache Doris 4.1 的 Spill to Disk 是一套深度融合了内存预留、智能调度、压力感知的现代化...

文章系统解析了 Apache Doris 4.1 的 Spill to Disk 机制,用于避免哈希关联、聚合、排序等内存密集型查询触发 OOM。核心增强包括核心算子全覆盖、递归重分区应对数据倾斜,以及基于内存压力感知的主动落盘触发。文章详细说明了由控制层、算子层、基础设施层和内存管理层组成的统一架构,以及预留、暂停、落盘、恢复四阶段流程。针对 Hash Join、Aggregation、Sort 分别给出了化整为零、临时状态落盘和外部归并排序的具体实现策略。基准测试显示,在单 BE 16GB 内存下运行 TPC-DS 10TB 查询,复杂查询全部完成且内存被控制在 8GB 以内,部分场景落盘数据量超过 1000GB,验证了以磁盘 I/O 换取内存空间的可行性。当前 Intersect/Except 算子暂不支持直接 Spill,需要通过等价 Join 改写。

推荐收录,因为文章不仅介绍功能,还深入解释了内存压力感知、算子级落盘策略和统一架构设计,并给出了可验证的基准测试数据。对从事数据库内核开发、性能调优或超大规模分析查询的读者具有直接参考价值,其“预留-暂停-落盘-恢复”的资源控制方法和外部归并排序等思路也可迁移到其他内存受限的查询引擎中。

技术文章pganalyze Blog

Postgres in Production Special Series: Diagnosing High Cardinality Workloads in pg_stat_statements (Part 6)

本文是 pg_stat_statements 深度系列第六篇,聚焦高基数查询负载的诊断。作者将高基数定义为工作负载持续产生的唯一归一化查询数超过 pg_stat_statements.max 容量,导致扩展无法保留调优所需指标。文章指出唯一查询主要来自 ORM、动态 SQL、即席报表、AI 辅助工具以及 Postgres 17 及以下的变长 IN 列表。通过 Bluebox 演示,相同负载在 Postgres 17 产生 671 条唯一语句,Postgres 18 仅 120 条,验证了 IN 列表归一化的效果。文章给出五项诊断检查:了解 max 设置、观察重置后回填速度、监控释放计数器、查找缺失查询、观察 top 查询变化;并建议调整设置、升级到 Postgres 18、与开发团队协作。边界是演示基于特定工具,经验性建议需结合具体环境。

推荐收录。文章提供了可操作的五项诊断检查(如观察 pg_stat_statements_info 释放计数器、重置后回填速度),并给出 Postgres 17 与 18 的量化对比(671 vs 120 条唯一语句),帮助 DBA 和 SRE 判断监控数据是否因高基数负载而丢失。适合 PostgreSQL 运维、性能调优和可观测性建设场景,其诊断思路和工具来源分析可迁移到其他数据库监控实践。风险在于内容源于厂商博客且为经验总结,需结合自身负载验证。

工程实践TiDB 社区博客 - 实践案例

稳住大考阅卷高并发!学科网数据库架构的平滑演进与实践

文章复盘学科网阅卷系统从 MySQL 迁移到 TiDB 的实践,背景是业务具有峰谷特征、单机 MySQL 主备集群出现容量与性能瓶颈,同时研发资源有限无法改造代码。作者详细说明选型 TiDB 的关键理由:高度兼容 MySQL 实现零代码迁移、在线 DDL 不阻塞业务、弹性扩缩容适配流量波动、Raft 多副本保证数据强一致。迁移采用分批策略,优先将大表和主从延迟严重的表迁入,收益包括缓解并发压力、消除切换数据不一致风险、节省磁盘空间并避免分库分表改造。文中还总结了扩容规划、小表热点处理、低峰版本升级和索引优化等运维经验。该方案尤其适合教育行业等需要兼容 MySQL 且短时高并发的场景,但需注意跨 AZ 缩容的数据分布和热点小表的处理。

推荐收录,因为文章提供了真实业务约束下的数据库选型、迁移和运维全过程,包含零代码改造、在线 DDL、强一致、扩容规划、小表热点等具体细节,不是泛泛的技术宣传。适合数据库架构师、SRE 以及教育行业技术负责人参考,其“先兼容迁移、争取时间”的平滑演进思路可迁移到其他受限于 MySQL 单机瓶颈且短期无法大改代码的团队。

工程实践TiDB 社区博客 - 实践案例

关于TiDB集群(TiKV数据留存)的恢复策略

文章围绕TiDB集群在元数据和管理信息完全丢失、仅保留TiKV数据文件情况下的恢复策略展开。作者以测试环境模拟案件取证场景,先通过TiKV日志提取原集群的Cluster ID,然后销毁原有集群与tiup元数据,重新部署相同版本TiDB集群,并将TiKV数据目录指向物理拷贝路径。随后修改last_tikv.toml中的日志、数据、raft等路径,使用pd-recover工具重置Cluster ID,最后启动集群并验证各组件状态。该方法适用于TiDB v6.1.0环境且TiKV数据完整、PD元数据不可恢复的场景。文章给出了具体命令和配置修改项,但未深入解释pd-recover原理、数据一致性验证细节及操作风险,整体更偏向可复现的操作记录。

推荐收录,因为文章提供了一个具体且可复现的TiDB灾难恢复案例,尤其适合运维人员或数据库管理员在元数据丢失时参考。文中的操作步骤、配置修改和Cluster ID恢复方法具备可迁移性,但需注意版本差异和数据一致性风险,建议结合官方文档使用。

工具笔记Simon Willison

alchemy-utils 0.1a0

文章宣布发布 alchemy-utils 0.1a0,这是一个基于 SQLAlchemy 的数据库无关版 sqlite-utils,目标是沿用 sqlite-utils 的核心 API(insert、upsert、insert_all、upsert_all、create、update 和表内省),同时支持 PostgreSQL、SQLite 和 DuckDB。作者通过给 Codex 和 GPT-5.6 Sol Ultra 下达研究性 spike 提示,配合 uv、TDD 和 pytest,在很少的后续提示下获得了可发布的原型。文中展示了用 uvx 列出 PostgreSQL 表数据以及将 CSV 导入 DuckDB 的命令示例,并提到将初始约一小时的 CSV 导入优化到约 35 秒。整体是一篇发布说明,未深入讨论 API 设计权衡、错误处理或扩展性,但提供了 AI 辅助开发数据库工具的具体案例。

推荐收录,因为它记录了一个使用 AI 编程代理快速构建跨数据库 Python 工具的真实过程,并给出了可运行的命令示例,对关注 AI 辅助开发、Python 数据库工具链或 sqlite-utils 生态的读者有直接参考价值。文章虽为 alpha 发布说明,但其中的提示工程思路、uvx 用法和性能优化片段可以迁移到类似项目中。

技术文章TiDB 社区博客 - 技术解读

AI Agent 的"大脑记忆":为什么向量+关系+全文检索必须一体化

文章系统讨论 AI Agent 的记忆体系,借鉴认知科学将记忆分为短期、语义和情景三层,并补充全文检索记忆需求。作者批评用 Redis、MySQL、向量库和 Elasticsearch 拼接的方案存在数据一致性、混合查询困难和运维复杂等痛点,提出应在同一数据库内核中原生融合关系、向量和全文检索能力。文章以 TiDB 8.5 为例,展示通过 VECTOR 列、向量索引和全文索引在单条 SQL 中组合结构化过滤、语义检索和关键词匹配的实现方式,并说明平凯云服务的 Serverless 弹性、HTAP 能力和全球部署优势。文章适合关注 Agent 记忆系统、RAG 或数据库选型的开发者,但需注意其官方博客的产品宣传色彩和方案边界。

推荐收录。文章不仅解释了 Agent 记忆的分类和需求,还具体分析了多系统拼接架构的工程痛点,并给出使用 TiDB 原生融合关系、向量和全文检索的 SQL 示例,证据具体、有可操作价值。适合构建有状态 AI Agent、RAG 应用或需要混合检索能力的开发者参考,可迁移架构思路,但需注意其中隐含的厂商推广和 TiDB 特定实现约束。

工程实践ClickHouse Engineering

What's new in pg_clickhouse v0.10.0: Subqueries, TPC-H Speedups, C Driver, and Aggregates

文章介绍 pg_clickhouse v0.10.0 的更新,重点是扩大 PostgreSQL 查询向 ClickHouse 下推的范围。作者以 TPC-H 为度量,将完全下推的查询从 22 条中的 12 条提升到 16 条;Q17 从 32.7 秒降至 37 毫秒,并快于原生 PostgreSQL 的 2.1 秒。技术核心是把相关子查询与 NOT IN 下推为半连接/反连接,同时用额外空值守卫弥合 PostgreSQL 三值逻辑与 ClickHouse 二值逻辑在 NULL 上的语义差异。工程侧还改用 clickhouse-c 重写 C 驱动,统一 HTTP 与二进制 Native 协议,修复并发扫描连接冲突,并扩展统计聚合、有序集聚合和分区聚合下推。文章明确仍剩 6 条 TPC-H 查询未下推,受限于 join tree 两侧遍历,且相关子查询要求 ClickHouse 25.8 以上,否则回退本地执行。

推荐收录:文章不仅列出 pg_clickhouse 新功能,还给出可验证的 TPC-H 性能改进(Q17 32.7s→37ms)、三值/二值逻辑差异导致的正确性陷阱及守卫实现,以及驱动层从 C++ 到 C 的架构权衡和并发修复。对使用 PostgreSQL FDW、构建异构数据库查询下推、OLAP 加速或数据库扩展开发的工程师具有直接参考价值,其语义兼容性验证思路可迁移到其他数据源集成场景。

工程实践PlanetScale Blog

The dangers of Postgres subtransactions

文章深入分析PostgreSQL子事务缓存溢出机制及其双重危害:当单个事务累积超过PGPROC_MAX_CACHED_SUBXIDS(默认64)个子事务时,快照标记溢出,迫使所有查询走pg_subtrans SLRU查找,导致集群吞吐量骤降;同时在构建新只读副本时,溢出的RUNNING_XACTS记录使副本无法获取完整活动事务快照,长期无法启用热备模式。作者通过WAL解码、基准测试和火焰图验证了性能退化路径,并给出事务超时监控、pg_stat_slru跟踪等检测与缓解方法。指出重建PostgreSQL或等待CSN快照补丁合并是根本性方向,但当前需依赖运维手段降低风险。

推荐收录,因为文章不仅解释了子事务缓存溢出的原理,还提供了可复现的基准测试和火焰图分析,并展示了从现象到机制、从监控到缓解的完整工程路径。对于PostgreSQL数据库管理员、后端开发者及高可用架构师,本文能够帮助他们识别和规避这类集群级性能悬崖,其故障排查思路和监控设计也可以迁移到其他数据库系统的类似内部机制问题中。

工程实践TiDB 社区博客 - 实践案例

15秒切换、零数据丢失!永康卫健委用平凯数据库(TiDB企业版)物理复制筑牢全民健康平台"生命线"

文章记录了永康市卫健委全民健康平台为解决业务高峰负载过高与容灾需求,采用平凯数据库物理复制能力进行架构改造的实践。改造将主集群专注核心事务,备集群承担报表查询等读操作和容灾角色,实现读写分离。上线后故障切换低于15秒且数据零丢失,系统负载下降,运维操作秒级完成。文章解释了物理复制基于日志实时同步所有数据库对象,支持最大保护、最大可用、最大性能三种模式,并与 TiCDC 逻辑复制对比,指出物理复制适合集群级容灾和读写分离,逻辑复制适合异构同步与数据管道。实际指标依赖网络拓扑和负载,且相关能力仍在演进。

推荐收录,因为文章提供了真实医疗场景下的数据库高可用与读写分离改造案例,包含明确的问题定义、技术选型依据、实施效果和方案对比。适合关注核心系统容灾、分布式数据库选型或架构优化的读者。可迁移价值在于展示了物理复制在强一致需求下的应用边界,但需注意厂商案例可能带有一定推广成分。

工程实践Andy Atkinson

Adding and Removing Big Indexes in PostgreSQL

文章介绍了在 PostgreSQL 大型表上安全添加和删除大索引的完整操作方案。针对创建索引可能持续数小时且需与线上查询并发执行的场景,作者详细说明了使用 CONCURRENTLY 选项避免写操作阻塞、设置 lock_timeout 和 statement_timeout 保护、在 screen/tmux 后台运行、通过特殊查询监控多阶段进度(扫描堆、排序元组、加载元组等)以及调整 maintenance_work_mem 和 max_parallel_maintenance_workers 优化资源的具体方法;同时提供了失败后清理 invalid 索引和处理唯一性限制的注意事项,并给出了最终可直接执行的命令模板。文中基于真实操作给出了各阶段耗时(总计约 6 小时)和性能特征,但方案仅适用于非分区表,且要求手动监控和串行执行并发构建。

推荐收录,因为它不是简单的语法介绍,而是生产环境中管理大表索引的实战手册,包含锁定超时、语句超时、并行度设置、进度监控查询等可复用的工程实践。适合数据库管理员、PostgreSQL 运维人员和后端工程师参考,文中的参数调整思路和阶段监控方法可直接迁移到其他长时 DDL 操作的安全执行中。

技术文章Simon Willison

SQLite compressed text-history prototypes

文章探索在 SQLite 关系数据库中高效存储文本修订历史的方案。作者提出将文档的每个历史版本完整放入 JSON 字符串数组,再整体用 zlib 或 Zstandard 压缩,以 BLOB 形式存储;另用整数数组列保存时间戳,避免压缩。通过 GPT 辅助生成 Python 原型并模拟 1000 次修订,实验显示 20.4MB 原始修订文本压缩后仅 80.3KB,验证了冗余重复带来的高压缩比。为规避每次编辑全量解压重压缩的开销,进一步提出将历史拆分为多行,每行最多保留 128 个修订或 3MB 未压缩 JSON。该方案实现简单,适用于编辑频繁且文本重复度高的历史记录场景,但尚未评估高频写入、版本检索和并发冲突等生产级问题。

推荐收录,因为文章给出了一个可复现的原型验证:1000 次修订从 20.4MB 压缩至 80.3KB,并明确了拆行存储的工程折衷。这种利用全文冗余进行压缩的简单方案对处理版本历史、审计日志或文档快照的工程师有直接参考价值,可迁移到其他需要高效存储多版本文本的场景。主要风险是未与增量存储或事件溯源等常见方案做对比,也未覆盖高并发写入和随机版本读取的约束。

工程实践TiDB 社区博客 - 实践案例

openEuler 部署 TiDB:锁索引故障 + Sysbench 实战

文章记录了在 openEuler 22.03 SP4 国产化操作系统上部署 TiDB v8.5 的完整实践过程,包括 TiUP Playground 快速测试和 TiUP Cluster 单机模拟生产两种方案。作者详细列出了与官方 CentOS/RHEL 文档差异导致的典型问题,如 bash_profile 环境变量不生效、Playground 监听 127.0.0.1、openEuler 默认 MaxSessions=10 导致 SSH 并发连接失败、禁止 root 运行 TiDB 进程、防火墙端口放行、随机密码保存等,并给出对应解决命令。随后使用 Sysbench 进行只读和读写混合压测,复现了读写混合场景下的锁等待超时故障,分析了热点索引页、乐观事务冲突等成因,并通过调整隔离级别、增加 TiKV scheduler-concurrency、使用 --skip-trx 等方法缓解。文章适用于国产化环境部署 TiDB 和初步进行基准测试与故障排查的读者,但部分建议需根据实际业务场景谨慎采用。

推荐收录,因为它是真实环境下的部署与压测案例,覆盖了国产操作系统与分布式数据库兼容性问题、SSH 并发限制、权限管理等工程约束,以及基于 Sysbench 的锁等待故障分析。适合需要在 openEuler 等信创系统上部署 TiDB 或学习分布式数据库基准测试和初步排障的工程师,文中命令和排查路径可直接迁移到类似环境。主要风险是部分优化建议如降低隔离级别需结合业务正确性验证,不宜直接照搬生产环境。

工程实践QuestDB Engineering

Read Streaming 500 million rows into Apache Arrow in 2.3 seconds

文章测试 QuestDB 新 QWP 协议将查询结果流式传输到 Apache Arrow 的性能,并与 ClickHouse、TimescaleDB 对比。作者用简单查询和并行读取器基准,测量 500M 行数据的导出速度。最初几轮结果受磁盘 I/O、Python GIL 等因素影响,修正后 QuestDB 达到 220M 行/秒,首批数据仅 32ms,比 ClickHouse 最快流式路径快 2.35 倍。文章还分析了每行字节数、存储占用、扩展性和协调成本,并指出测试的局限(单一 schema、低基数字符串等)。该文提供了可复现的测试方法和详实的过程反思。

推荐收录,因为它不是简单的产品宣传,而是深入的工程基准测试,展示了如何识别并消除磁盘、GIL、协调成本等测试伪影,并提供了可复现的仓库和明确的局限声明。适合数据库选型、性能评估或数据管道设计的读者,可迁移价值在于严谨的流式数据导出基准测试方法和工程分析框架。

工程实践PlanetScale Blog

Concurrency vs. Throughput: why more parallelism can make databases slower

文章复盘了一次 MySQL 生产事故:一个长事务导致 InnoDB 版本历史膨胀,使读查询成本随并发量平方级增长,最终拖垮数据库。作者运用 Gunther 通用可伸缩性定律解析了争用系数 α 与一致性开销系数 β,阐明为何超过临界并发数后吞吐量反而下降。解决方案是将 Vitess 事务池从一万降低到约一千并引入排队,模拟原有线程池的反压行为,从而避免大量并发请求涌入存储引擎。配置变更后,系统在类似流量尖峰下吞吐稳定、无报错,MySQL 内部并发数控制在两百以内。文章强调此策略适用于悲观锁、热点行等高争用场景,且思路可迁移至 Postgres 等系统。

推荐收录,因为文章通过真实事故展示了并发与吞吐的逆向关系,并用通用可伸缩性定律提供量化分析。对负责高并发数据库、稳定性工程及反压机制设计的读者具有直接参考价值,可迁移到类似数据库和分布式系统中。文中提供的实验数据和配置对比使其结论可信,且明确给出了适用边界。

工程实践ClickHouse Engineering

What is WAL backpressure, and why does ClickHouse Managed Postgres need it?

文章解释 ClickHouse Managed Postgres 为何以及如何对 Postgres 施加 WAL 写入背压。Postgres 先把所有变更写入 WAL,归档器再把完成的段上传到对象存储,未上传的段无法删除;一旦写入快于归档,WAL 会堆积直至撑满磁盘,而磁盘耗尽会触发 PANIC 导致实例宕机。系统用一个 systemd 定时器每 15 秒统计积压段数,通过 cgroup v2 I/O 控制器按 80%/50%/20% 三档限制客户端后端的写带宽,并把归档、检查点、日志等排空路径按进程名划入不受限的 immune 组。作者在单台 m7i.2xlarge、500MB/s gp3 上以限速 4MB/s 的 archive_command 做 35 分钟 pgbench 实验,验证分级限流按阈值触发、积压清零后自动解除、数据盘始终未超 33%。文中也指出一个边界:该负载写入几乎全是 WAL,限流对吞吐的削减远大于对 WAL 生成的抑制(仅约 10%),效果取决于写负载的数据密度。

推荐收录。文章把“WAL 归档跟不上会导致磁盘写满并 PANIC”这一真实运维风险,拆解为基于 cgroup v2 的分级写带宽限流方案,并给出可复现的 35 分钟压测时间线、cgroup 分类证据和限流对 WAL 生成抑制有限的明确边界。适合负责 Postgres/数据库托管、可靠性与容量控制的工程师,其中“不限制排空路径、只在数据面自我保护、按积压分级降速”的取舍可迁移到其他写入放大与异步归档场景。

工程实践ClickHouse Engineering

Fixed cadence to seconds: making ClickHouse Cloud autoscaling more reactive

文章复盘 ClickHouse Cloud 如何把自动扩缩容推荐服务从固定定时轮询改造成秒级反应式架构。原实现按固定节奏扫描全部服务,导致周期之间发生 OOM 或负载突增时必须等到下一次 tick 才能扩容,问题本质是延迟而非推荐逻辑错误。作者复用 Kubernetes 生态的 controller-runtime 作为通用事件处理引擎,把周期性扫描与反应式快路径都抽象为 source,统一投递到带键去重、指数退避和并发上限的工作队列,由同一个幂等 reconcile 函数产出推荐,因此无需自研触发协调机制。反应式信号以事件行写入 ClickHouse 专用小表,由物化视图在写入时过滤越阈指标,source 每几秒执行一次五分钟窗口查询,使关键事件在数秒内触发扩容;周期性全量扫描仍保留作为安全网与缩容兜底。文章也明确边界:工作队列仅存在于单进程内存,无持久化与重放,它是电平触发的 reconcile 引擎而非流处理器,不支持事件时间窗口、join 或跨事件聚合,轮询间隔构成反应速度下限;若未来需要保证投递、严格顺序或状态化窗口关联,应迁移到流式平台。

推荐收录:文章给出完整的问题定义、架构改造路径和可复现的 Go 与 SQL 片段,把“用 controller-runtime 当通用事件引擎、用 ClickHouse 存反应式信号”这一非显然选择连同去重、退避、并发控制的收益讲清楚。对做自动扩缩容、Kubernetes 控制器或实时信号管道的工程师有直接迁移价值;同时明确标注内存队列无持久化、轮询间隔是延迟下限等约束,避免读者误用。

工程实践ClickHouse Engineering

I created a playground for 110 database systems

文章由 ClickHouse 作者复盘如何把 ClickBench 扩展成一个可交互的 Playground:用统一脚本接口重构上百个数据库的安装、加载与查询流程,并让约 110 个系统各自带着 1 亿行预载数据接受在线查询。核心难点在于低成本且安全地托管这些系统,作者逐项否决 EC2 常驻、Lambda、ECS/EKS 与 Docker 隔离方案,最终选择在 metal 机器上用 Firecracker/QEMU 做嵌套虚拟化,构建"云中之云"。资源层通过 CPU 超卖加看门狗、把 guest swap 映射到 host page cache 实现弹性内存、用稀疏文件与 XFS reflink、再迁移到 BtrFS+zstd 压缩,把上百个系统塞进 7.5TB 本地盘。网络层用 tap 设备加 iptables 做 NAT 网关,并基于 TLS SNI 字段实现带白名单的 HTTPS 代理,安装期放行外网、查询期断网以防逃逸和 IMDS 访问;快照冷启动控制在 5 秒内,查询出错即回滚。文章偏经验叙述,未给出完整压测数据与量化对比,隔离强度也依赖运营方自行评估。

收录理由在于它把"托管上百个异构数据库"这一非典型问题拆解到虚拟化选型、内存与磁盘超卖、网络出口过滤三条主线,每一步都给了被否决方案的原因和最终取舍,而非结论式陈述。做数据库评测平台、沙箱执行环境、多租户隔离或 Kubernetes 之外自建基础设施的工程师,可直接迁移其中的 Firecracker 嵌套虚拟化、reflink 快照与 SNI 白名单代理思路,并据此评估自身成本与安全边界。

工程实践PlanetScale Blog

Massively parallel Postgres backups

文章详细介绍了 PlanetScale 如何对分片 Postgres 数据库实现大规模并行备份。核心方法是:每个分片临时启动独立 EC2 实例,从 S3 恢复前次备份,再通过混合回放 WAL(先 S3 后直接从主库拉取最近几分钟日志)将备份追齐到当前状态,最后加密上传到 S3。文中还解释了初始备份的特殊处理、这种并行架构带来的备份速度优势(如 32 TB 数据库在 8 分片下仅需约 2.8 小时),以及备份在数据库扩缩容和节点故障替换中的实际工程用途。文章面向数据库基础设施工程师,展示了如何在降低生产影响的前提下实现快速、一致的备份,但其方案强依赖云环境与 PlanetScale 自研组件,迁移时需适配。

推荐收录,因为它不是泛泛的介绍,而是给出了一个真实工程系统的完整备份流程,包括架构取舍(用临时节点隔离生产影响)、混合 WAL 回放策略和可量化的并行加速效果。对负责大型数据库运维、备份恢复系统设计的工程师来说,文中的临时节点编排、S3 与主库混合回放、分片并行思想等有直接迁移价值,即使具体技术栈不同。

工程实践Crunchy Data Blog

Hybrid Search Patterns with Postgres and pgvector

文章系统探讨了在PostgreSQL和pgvector中实现混合搜索(向量相似度加标量过滤)的工程模式。首先阐述了pgvector迭代索引扫描如何平衡召回与性能,然后分析了向量优先和标量优先两条路径各自的适用场景与局限。作者进一步提供了三种实用工作区:为低基数过滤构建部分HNSW索引;通过过采样再过滤应对高基数或临时过滤器;以及利用缓存加速重复查询。文中给出了过采样的估算公式、查询计划诊断方法以及各方案的决策指南,并强调了每种模式在召回率、性能和维护成本之间的权衡。

推荐收录,因为本文是针对Postgres+pgvector混合搜索问题的实战指南,从问题根源到四种解决方案给出了完整的权衡分析、代码示例和调优公式,远超简单教程。适合正在构建带标量过滤的向量搜索系统的工程师,文中部分索引、过采样和缓存等模式可直接应用于生产环境,决策树和EXPLAIN诊断方法具有跨场景的可迁移价值。

工程实践ClickHouse Engineering

Choosing Between ClickStack and Grafana for ClickHouse Observability

文章比较 ClickStack 与 Grafana ClickHouse 插件在 ClickHouse 可观测性中的定位。Grafana 是“大帐篷”式监控优先路线,强在跨数据源仪表盘、告警和 Prometheus 生态;ClickStack 则围绕 ClickHouse 单一引擎优化,提供搜索式排查、原生日志/指标/链路/会话关联,以及 MCP 和 AI notebooks 支持自建 SRE Agent。文章给出选择规则:ClickHouse 是主要遥测库且需要调查式体验时选 ClickStack;已有异构监控体系、依赖 Prometheus 告警或跨系统仪表盘时选 Grafana,也可二者并用。作者提醒 PromQL 支持仍属实验,二者各有生态边界,应随团队工作方式调整。

推荐收录。文章把工具选择拆成监控优先与调查优先、多引擎与单引擎、预定义仪表盘与搜索式排查三组取舍,并明确给出 ClickStack/Grafana/二者并用的决策规则和 PromQL 实验性等边界。适合正在以 ClickHouse 构建可观测性平台的架构师、SRE 和平台工程团队参考;主要风险是内容来自 ClickStack 厂商,读者应结合自身数据源生态与成本验证。

工程实践ClickHouse Engineering

Benchmarking NVMe-backed Managed Postgres: PlanetScale and ClickHouse

文章基于开源可复现的 PostgresBench 基准,用 pgbench 的类 TPC-B 短事务高并发负载,在相同 AWS r8gd 实例(本地 NVMe、一主两同步备、quorum 复制)上对比 ClickHouse Managed Postgres 与 PlanetScale Metal。结果显示 ClickHouse 在 16vCPU/128GB 与 4vCPU/32GB 两种配置下均领先:100GB 数据集吞吐高约 34%–51%,500GB 数据集高约 54%,平均延迟与 P95/P99 也更低。作者把差异归因于系统级优化,如 2MB 大页、wal_compression=lz4、按实例规模调整 max_wal_size 等,并指出 PlanetScale 暴露的配置中巨大页与 WAL 压缩关闭、max_wal_size 仅 8GB。文章也承认仍存在未通过 pg_settings 暴露的实现差异,建议用户用自己的负载做概念验证。

推荐收录,因为它提供了可复现的开源基准 PostgresBench、明确的 pgbench 命令与硬件/复制配置,并对比了两项服务可见的 Postgres 配置差异(大页、WAL 压缩、max_wal_size),这些调优要点可迁移到自建或托管 Postgres 的运维中。适合评估托管 Postgres 或做 OLTP 性能调优的读者。主要风险是它由 ClickHouse 自测、属厂商对比,具体 TPS 数字会随产品迭代过时,应结合自身负载验证。

工程实践ClickHouse Engineering

Instrumenting my espresso machine with OpenTelemetry

文章以搭载 ESP32 开源控制器 GaggiMate 的 Gaggia 咖啡机为对象,把每次萃取当作分布式系统请求,用 OpenTelemetry 埋点并经 ClickStack 把遥测送入 ClickHouse 存储分析。关键工程点包括:裁剪上游 OTLP protobuf 为保留字段号的单文件子集以适配微控制器内存;把导出任务绑定第二个核心、用快照式加锁与队列满即丢弃,保证网络 I/O 不阻塞 50ms 萃取控制环;在设备端以恒定内存计算阻力变异系数等派生指标,并用 protobuf 拼接生成高分辨率曲线。文中还记录了跨线程 String 竞态与 TLS 栈溢出两个崩溃修复、基于 OCB 构建带 MQTT receiver 的定制 collector,以及只读 LLM Agent 经 MCP 查询闭环给出调整建议。结论强调 OTLP 是通用契约、埋点不得危及被观测系统、列式存储化解高基数问题;局限是整体仍属爱好级玩具问题,研磨度等关键上下文依赖人工录入。

推荐收录:文章把 OTLP protobuf 裁剪、ESP32 双核实时任务隔离、快照加锁与 drop-don't-block、设备端流式统计、protobuf 拼接、基于 OCB 的定制 MQTT collector 讲得具体且附字段号与代码,并用最坏情况测试验证编码器边界。适合可观测性、嵌入式/物联网遥测管道与列式存储方向的工程师,其中'埋点不得阻塞被观测系统''列式存储化解高基数'等经验可迁移到生产系统;局限是部分结论绑定 ClickStack/ClickHouse 生态。

工程实践Spotify Engineering

Indexing the Data Lake for Online Point Queries

文章介绍 Spotify 提出的 Random Access Parquet(RAP)方案,让数据湖中的 Parquet 文件直接支持在线点查询,服务个性化功能与 AI Agent 的上下文检索。作者指出瓶颈不在存储层,而在 Trino、BigQuery 等分布式 SQL 引擎的调度与查询规划开销,以及文件内查找所需的链式依赖读取。RAP 通过外部索引把 key 直接映射到文件与行号,再发起精确的 ranged read,索引实现为可追加的 multimap。文章进一步给出面向预写文件的优化(按 key 排序、co-grouping、粗粒度分区、每 key 一页、ZSTD frame reset、存储对齐、blob/Variant、列交织、覆盖索引)及其对分析负载的取舍。结论是同一份 Parquet 文件可同时服务分析与交互式访问,避免重复存储,但部分优化会牺牲列裁剪等分析能力。

推荐收录:文章来自 Spotify 一线实践,清晰定义了数据湖点查询这一真实工程问题,并给出索引结构、文件布局优化与逐项取舍,证据具体。适合数据平台、存储与后端工程师,尤其在构建低延迟检索或为 AI Agent 供给上下文时,其“一份数据双访问模式”思路与 Parquet 改造技巧可直接迁移。

技术文章PlanetScale Blog

Postgres backups under the hood

文章深入解析 PostgreSQL 的三种备份方式:逻辑备份(pg_dump)、文件系统备份和连续归档。首先介绍 pg_dump 如何利用 MVCC 获取一致性快照,并指出其在特大库上可能因长期持有快照导致事务回卷而触发只读模式的风险。接着说明文件系统备份虽然速度快,但需要停机或原子快照支持,且无法实现时间点恢复。重点阐述了连续归档的原理:通过持续归档 WAL,结合 full_page_writes 在线备份文件系统后,利用 WAL 中的完整页镜像修复备份过程中可能出现的“涂抹”数据,从而得到一致且可恢复的备份。文章还解释了基于此机制的时间点恢复过程,以及 PlanetScale 如何通过每 12 小时自动备份与控制 WAL 重放窗口来保持恢复速度。最后简要提及大规模备份的挑战,为介绍分布式 PostgreSQL 与分片备份埋下伏笔。

本文不只是罗列备份命令,而是清晰解释了 pg_dump 的事务回卷风险、WAL 与 full_page_writes 如何解决在线备份的一致性难题,以及时间点恢复的内部逻辑。这些内容对数据库管理员、后端工程师和运维人员有直接参考价值,能帮助理解备份策略的真实约束和取舍,迁移至其他数据库系统时也有启发。

技术文章PlanetScale Blog

What's new in Postgres 19

文章详细介绍了 Postgres 19 的三个主要变化:在线表压缩 REPACK、默认禁用 JIT 以及查询规划器的多项改进。REPACK 功能将 VACUUM FULL 和 CLUSTER 整合为一个支持在线操作的命令,使用逻辑解码与复制槽实现非阻塞重写,但存在额外磁盘空间和 MVCC 安全等限制。默认禁用 JIT 是因为其对 OLTP 查询可能引入的编译开销,转而允许用户按需启用。查询规划器新增了早期聚合优化,可在特定条件下将聚合下推到连接之前,并改进了 NOT IN 的处理。文章通过示例和对比展示了这些特性的用法与边界,还简要提及了 lz4 默认 TOAST 压缩、并行 autovacuum 等其他改进,为 PostgreSQL 用户和管理员提供了全面的升级指导。

推荐收录,因文章不仅列出新特性,还深入解析了设计动机、内部机制(如 REPACK CONCURRENTLY 使用复制槽与快照实现在线重写)和实际影响(JIT 默认禁用的权衡),附带代码示例和注意事项。适合数据库管理员、后端开发者了解 PostgreSQL 19 的关键变化与适用场景,其技术深度和实用性对长期运维参考价值显著。

工程实践ClickHouse Engineering

PostgresBench: Measuring the impact of High Availability on Managed Postgres performance

文章介绍 ClickHouse 团队开源的 PostgresBench 在加入高可用(HA)配置后的第二轮结果,对比 ClickHouse Managed Postgres、Crunchy Bridge、AWS RDS、Aurora 与 Neon 在匹配主库算力、相近持久化级别下的表现。作者把托管 Postgres 的 HA 实现分为共享无(本地存储 + PostgreSQL 流复制 + 热备节点)与共享存储(计算存储分离、提交路径写多份 WAL)两类,并以“主库故障后 2 分钟内恢复且零数据丢失”作为 HA 定义。在 16 vCPU/64 GB、500 GB 数据集、10 分钟压测下,同步复制代价明显:ClickHouse 双同步备库 TPS 降至单机 79%、p99 升至 254%,RDS Multi-AZ 集群 p99 升至 627%。结论是匹配持久化级别时 ClickHouse Managed Postgres 吞吐与延迟优于其他托管服务;但数据为厂商自测、存储后端冗余配置未公开,对 Neon 的评价带明显倾向,需谨慎解读。

推荐收录:文章给出可复现的开源基准、明确的 HA 定义(2 分钟 RTO + 零丢失)、各厂商实例配置,并用数据量化同步复制对 p99 尾延迟的放大(最高 6 倍以上),对做数据库选型与 HA 架构权衡的工程师有直接参考价值。风险在于这是厂商自测且对比自家产品的稿件,Aurora/Neon 存储冗余未公开、对 Neon 评价带倾向,建议以方法学与相对趋势为主,而非绝对排名。

技术文章PlanetScale Blog

Every UPDATE Leaves a Ghost: MVCC, Bloat, and VACUUM in PostgreSQL

本文深入解析 PostgreSQL 的 MVCC 实现,从元组(tuple)层面阐述多版本并发控制的原理。文章详细介绍了系统列 xmin 与 xmax 如何记录事务可见性,以及快照隔离如何通过 xmin/xmax/xip_list 决定事务看到的数据版本。进一步讲解了子事务、命令 ID(cmin)在解决 Halloween 问题中的作用,并通过 pageinspect 扩展展示页面布局与 VACUUM 的清理过程。还讨论了标准 VACUUM 与 VACUUM FULL 的区别、HOT 链的指针重定向机制,以及事务视界对死元组回收的影响。全文结合大量可执行的 SQL 示例,对理解 PostgreSQL 的膨胀(bloat)与维护具有长期参考价值,但内容仅适用于 PostgreSQL 及其特定版本。

这是一篇高质量的 PostgreSQL 内部机制讲解,不仅涵盖了 MVCC、元组可见性和快照隔离等概念,还通过 pageinspect 和实际操作演示了 VACUUM 的底层行为。对于需要深入理解 PostgreSQL 表空间膨胀原因、定位长事务阻塞 vacuum 的数据库管理员和开发者来说,这些可复现的分析方法可以直接应用到生产问题的排查与预防中。

工程实践Marc Brooker

Aurora DSQL: Scalable, Multi-Region OLTP

Marc Brooker在这篇博客中介绍了Aurora DSQL论文,重点阐述了系统的整体目标:构建一个简化应用构建与运维、无需关心规模与可靠性的关系型数据库。文中强调了架构解耦的设计思想,将查询处理、事务、复制和控制面拆分为独立服务,并总结了来自Aurora与DynamoDB等系统的运营教训,如避免大缓存、提供强一致可扩展读、将昂贵操作下推到存储层。作者还讨论了乐观并发控制(OCC)在避免客户端阻塞和减少尾延迟方面的优势,以及多区域场景下的快速读写能力。博客最后指出,硬件与数据中心设计的进步使得强一致性成为更优选择,并提供了论文链接供进一步阅读。

作为Aurora DSQL系统的核心设计者之一,作者以第一视角提炼了论文的关键设计决策与运营经验,浓缩了现代分布式OLTP数据库的核心理念。文章对解耦架构、一致性选择、多区域扩展等问题的论述既权威又简明,适合分布式系统工程师、架构师及关注数据库技术演进的研究者快速获取全局认知,其总结的教训可迁移至其他大规模系统设计。

工程实践Julia Evans

Learning a few things about running SQLite

Julia Evans 分享了她近期在 Django 网站中使用 SQLite 时积累的几个运维经验。她首先发现对 4000 行的表使用 FTS5 全文搜索耗时 5 秒,运行 ANALYZE 后降至毫秒级,推测是查询计划不佳所致。清理大量行时,删除操作超过 5 秒会导致其他工作线程写入超时崩溃,她通过小批量处理来规避。备份方面,最初使用 sqlite3 VACUUM INTO 加上 restic 上传到 S3,但偶尔 OOM 并产生锁问题;近期改用 Litestream 进行增量备份。她还提到拆分多个数据库文件有助于管理。文章基于个人小型项目,作者坦言若需要多写入支持可能得迁移到 PostgreSQL。

本文来自真实工程实践,详细记录了 ANALYZE 优化查询、批量清理避免写入冲突以及两种备份方案的具体步骤,对使用 SQLite 搭建个人或小型 Web 应用的开发者有直接参考价值。虽然深度有限,但作者的反思和解决方案具有可迁移性,适合作为入门级运维经验收录。

技术文章Crunchy Data Blog

Postgres 19 Compression: from pglz to LZ4

Postgres 19计划将默认TOAST压缩算法从pglz切换为LZ4。本文追溯了从Postgres 7.0引入lztext到7.1实现TOAST与pglz的历史,解释了pglz设计的取舍:速度优先、极小内存占用、快速终止和零外部依赖。然后对比了LZ4的优势:更快的压缩速度(测试中提速约8倍)、更大的滑动窗口带来更好的压缩率,并保留了快速终止特性。文章详细说明了变长类型的varlena格式、EXTENDED/PLAIN/EXTERNAL/MAIN四种存储策略,以及写入时的压缩决策树:行大小超过约2KB阈值时,依次压缩前列大对象或移入TOAST表。此外,还介绍了B树索引中机会主义压缩的机制:当键值超过510字节时尝试压缩,并举例说明可压缩与不可压缩数据对索引的影响。整体内容既包含机制解析也包含实践测试,展示了Postgres团队在压缩演进上的谨慎策略。边界在于测试非科学化,且未深入LZ4算法内部细节。

本文系统梳理了Postgres压缩框架的历史、原理与决策路径,并结合代码示例和对比数据说明LZ4替代pglz的收益。适合需要理解Postgres存储优化、TOAST机制或索引限制的DBA与开发者,可迁移的价值在于掌握如何诊断压缩效果、选择存储策略以及评估算法升级对性能的影响。内容详实且有长期参考价值。

工程实践ClickHouse Engineering

Replacing the HDB: ClickHouse for historical ticker data

文章以 Binance 公开行情归档为数据源,演示如何用 ClickHouse 承载历史 tick 数据:实时层之外的历史层是低风险试验场,适合引入新数据库。核心手段是列式存储配合针对性编码——LowCardinality 处理低基数 symbol,DoubleDelta 压缩单调递增的 ts 与 trade_id,ZSTD/LZ4 利用重复字节模式。作者给出完整建表、写入与查询示例,覆盖 VWAP、OHLC K 线、ASOF JOIN 计算滑点等交易台常用分析,并用量表统计验证:一个月 191 GiB 原始 CSV 压缩至约 10 GiB,十个月 162 亿行仅 76 GiB,Cloud 成本约每月 1.88 美元,且查询延迟不随数据量增长,因为主键 (symbol, ts) 稀疏索引将扫描裁剪到万分之一。边界在于不按 symbol 与时间过滤的查询仍需全表扫描。

收录理由:文中不仅有可直接复用的建表结构、编码选择与 VWAP/OHLC/ASOF JOIN 查询,还给出压缩比、成本与查询计划等可验证证据,属于有取舍、有量化的真实工程案例。适合从事时序/行情数据、OLAP 选型与压缩调优的读者迁移到类似高写入、按维度过滤的分析型负载。风险在于内容为厂商博客,读者需注意其面向 ClickHouse 的视角,未与其他方案横向对比。

技术文章PlanetScale Blog

Making 768 servers look like 1

文章从数据库扩展瓶颈出发,解释了单节点和只读副本在写入吞吐、数据容量和备份速度上的局限,进而说明为何分片是超越数TB数据的必需方案。以存储1PB数据、跨越256个分片共768台服务器的场景为例,文章重点阐述代理层如何通过查询解析、路由规划和连接池,将众多分片对外表现为单一数据库。文中介绍了基于哈希的分片策略、JSON拓扑配置,并给出从应用经网络负载均衡到代理再到分片的完整数据流。文章主要提供架构层面的概览与工具选择(Neki for Postgres、Vitess for MySQL),而非深入实现细节,适合正在规划数据库扩展的工程师建立整体认知。

该文以清晰的架构图和具体规模为例,系统梳理了数据库分片的核心挑战与代理层设计,对理解分片系统的整体运作有实际参考价值。适合需要应对数据量增长的研发、DBA和基础设施工程师,可迁移的分层架构与路由思想能直接指导技术选型和方案设计。

工程实践ClickHouse Engineering

@clickhouse/rowbinary: when your library is also a parser compiler

文章介绍 ClickHouse 发布的 @clickhouse/rowbinary —— 一个读取/写入 RowBinary 格式的 Node.js 库,其独特之处在于同时以 Agent Skill 形式发布。库的第一层是按类型拆分的读取原语(覆盖 Nullable、Array、Map、Tuple、LowCardinality、DateTime64、Variant、Dynamic、JSON 等),每个原语被刻意写小、单一用途、避免 megamorphic 分派以便被 V8 单态化内联;第二层是 SKILL.md,教导编码 agent 依据查询的实际列类型把这些原语组装成专用解析器,而非在运行时逐格做类型分派。作者用基准证明:RowBinary 比正确的 JSON 路径快约 2.1–3.3 倍,agent 生成的解析器又比组合式通用读取器快 1.5–3.4 倍,每个解析器生成成本约 0.20 美元。文章还强调关键风险:从零手写解码器会静默损坏数据(UUID 字节序错误、UInt64 被舍入为 float64),而复用手写且经过测试的原语可做到“构造即正确”。适用边界明确:字符串密集型日志场景 RowBinary 反而慢于 JSONCompactEachRow,skill 自身也建议此时不要使用。

推荐收录。文章不是产品发布稿,而是用真实基准、生成成本与失败模式分析论证一个可迁移的工程范式:把传统代码生成编译器(protoc/flatc/Cap'n Proto 那种带 IR、后端和选项矩阵的形态)替换为“库作为参考实现 + agent 按查询特化”的技能,并强调生成代码是可审阅、可测试、由人提交的普通源码。对从事数据接入、数据库客户端、性能优化与 AI 工程化的读者尤其有价值;“防止 AI 生成代码静默损坏数据”以及“面向被阅读而非被调用的库该如何写注释与保持一致”的经验可直接迁移。风险在于结论依赖具体模型能力与基准环境,作者也承认小模型退化明显(Haiku 需聚焦子代理才从 52% 提升到 86%)。

工程实践Simon Willison

lobste.rs is now running on SQLite

文章记录了社区站点 Lobsters 从 MariaDB 迁移到 SQLite 的完整工程实践。自 2018 年起计划切换数据库,最初考虑 PostgreSQL,2025 年转向 SQLite 评估,并于近期完成迁移并稳定运行。新架构中 Rails 应用运行在单台 VPS 上,使用多个 SQLite 文件分别管理内容、缓存、队列和限流数据,总大小约 5.7GB。迁移后 CPU 与内存占用均下降,站点响应提升,VPS 成本减半。文章引用了详细的 PR 和讨论,展示了代码变更量、关键决策和验证过程,为类似规模站点的数据库选型与迁移提供了可参考的真实案例。

推荐收录,因为本文提供了从 MariaDB 到 SQLite 的真实迁移案例,包含决策背景、架构变化、性能对比和成本收益等具体证据。适合后端开发者、架构师及运维人员在评估轻量级数据库方案时参考,其单机多文件部署模式及限流中间件集成具有可迁移价值。

技术文章Simon Willison

DOOMQL

文章介绍了 DOOMQL 项目,一个完全用 SQLite 实现 Doom 式游戏的大胆实验,将移动、碰撞、敌人逻辑和光线追踪渲染全部写成 SQL 查询。作者展示了如何在终端运行该项目,并利用 Datasette 工具探索其生成的 SQLite 数据库;他还通过 Datasette Apps 插件快速构建了实时游戏画面仪表盘。文章重点在于演示 SQL(尤其是递归 CTE)在实时图形领域的非传统应用,以及如何结合 uv、Datasette 等工具进行探索式开发。适用边界在于这主要是技术验证和教学范例,不适合生产环境游戏开发,但其工具集成和查询设计思路对数据密集型应用的可视化或交互探索有启示意义。

本案例通过具体可复现的步骤,展示了用递归 CTE 实现光线追踪的工程做法,以及利用 Datasette 快速组装定制监控视图的实践。适合对数据库高级应用、工具链集成或创意编程感兴趣的开发者阅读,有助于掌握递归查询的深度用法和轻量级工具组合技巧。虽然游戏本身非工程级,但作为学习范例和灵感启发,其方法可迁移至数据探索、实时可视化等场景。

工程实践PlanetScale Blog

When the Postgres query planner goes rogue

文章记录了一次 PostgreSQL 生产事故:在没有代码或流量变化的情况下,数据库 CPU 飙升,查询延迟从毫秒级恶化到约 10 秒。通过监控工具定位到一个特定查询模式,发现其执行计划突然放弃索引而进行全表扫描。根因在于 PostgreSQL 查询优化器基于统计信息生成计划,而数据增长导致统计信息演变,使得优化器在罕见情况下选择次优计划。团队临时使用 Database Traffic Control 立即拦截该查询以恢复数据库健康,随后在安全环境通过 EXPLAIN 分析计划变化,并提出长期修复方案,包括执行 ANALYZE 刷新统计、调整索引或重写查询。文章展示了从发现现象、定位根因、应急止损到永久修复的完整工程流程,并点明查询计划不稳定的普遍风险与应对思路。

这篇文章是典型的数据库性能事件复盘,有明确的故障现象、诊断过程(延迟关联、计划变化对比)和分级应对方案。它不仅展示了应急响应手段,还解释了 PostgreSQL 优化器行为的技术背景,为 DBA 和开发者在类似场景下快速识别和修复计划退化提供了可迁移的经验。文中虽有产品功能描述,但技术分析独立且扎实,适合作为数据库稳定性实践案例收录。

工程实践知乎 - SmartCode 得物技术

得物 OceanBase 落地实践

文章详细记录了得物将 OceanBase 作为多模数据库引入的完整工程实践。面对 MySQL 在 TP/AP 混合负载下性能瓶颈、存储成本高和运维复杂等问题,DBA 团队从选型对比、性能压测、复杂 SQL 优化到业务迁移全流程展开验证。通过计划缓存、分区裁剪、列存索引、并行执行和 Hint 干预等五步优化,将两类聚合查询的执行时间分别从 1.3s 和 3.9s 降至 0.01s 和 0.02s,并获得与 DuckDB、StarRocks 对比的详细性能数据。在真实业务迁移中,SQL 平均耗时下降 88.3%,存储压缩率超过 80%,总体降本 43%,并消除了异构数据同步和手动分流风险。文章同时总结了迁移中遇到的实时物化视图与 DDL 冲突、SQL 语法兼容等具体问题及应对方案,并规划了运维体系转型和团队能力建设路径。该实践适用于有 TP/AP 混合负载、追求成本与可用性平衡的场景,但需注意新功能边界和版本限制。

推荐收录。文章不是泛泛的产品介绍,而是提供了从选型对比、性能压测到生产迁移的完整技术链条,包含具体的 SQL 优化思路、量化收益(近 200 倍提升、43% 降本)和踩坑记录,对考虑 OceanBase 落地或从 MySQL 迁移到分布式数据库的架构师、DBA 有直接可复用的参考价值。文中的五步优化法、物化视图使用约束和运维体系转型经验均具备可迁移性,风险提示也较为坦诚。

工程实践PlanetScale Blog

Deadlocks and downtime

文章围绕数据库死锁导致的排队、重试风暴和潜在宕机展开,先解释 Postgres 如何在 deadlock_timeout 之后检测锁环并回滚一个事务。作者指出,单次死锁通常可恢复,但当高并发下死锁频繁出现时,等待队列会迅速堆满连接池,死锁检测本身反而成为系统压力源。文中给出两类缓解手段:在查询与事务层面保持一致的加锁顺序、缩短事务并尽量晚加锁;在应用层对 40P01 错误做指数退避加随机抖动的重试,避免立即重复触发同一冲突。最后还介绍了通过 PlanetScale 的 Traffic Control 和 Resource Budget 在数据库侧限制问题查询并先以 warning 观察影响,再切换到 enforce 阻断锁竞争。文章适合处理高并发数据库系统的工程实践参考,但其效果依赖于死锁场景的规模、查询模式以及应用是否具备正确重试逻辑。

推荐收录,因为文章明确给出了死锁从“可恢复错误”演变为“队列堆积和宕机”的链条,并提供了查询顺序、事务长度、重试退避和数据库侧限流的组合治理方案。适合做数据库稳定性、故障预防和高并发系统设计的参考,且这些做法可迁移到其他关系型数据库与在线服务场景。

工程实践Simon Willison

sqlite-utils 4.0, now with database schema migrations

这篇文章记录了 sqlite-utils 4.0 的正式发布,重点介绍了三个面向长期维护的能力:数据库迁移、可嵌套事务 db.atomic(),以及复合外键支持。迁移机制采用 Python 文件和装饰器定义变更序列,并用 _sqlite_migrations 表追踪已执行项,底层依赖 table.transform() 以“建新表、拷贝数据、替换旧表”的方式实现 SQLite 原生 ALTER TABLE 不支持的结构调整。作者同时说明了 4.0 中的破坏性改动,包括 db.query() 只用于读查询、写入改用 db.execute()、upsert 的冲突处理改为标准 ON CONFLICT 语法,以及 CSV/TSV 类型推断默认开启。文章还讨论了这些设计为何比 Django 式迁移更简单、为何不提供回滚,以及从 sqlite-migrate 合并到 sqlite-utils 的演进背景。最后,作者用 Claude 和 GPT 辅助做了回归测试与文档校对,展示了 AI 在发现事务、外键和导入逻辑缺陷方面的实际价值,但内容边界主要仍是该库自身生态,不是通用 ORM 迁移框架。

文章直接给出了迁移系统、嵌套事务和复合外键的实现方式,还明确说明了破坏性 API 调整与适用边界,适合做 SQLite 工具库设计和演进的长期参考。对维护数据库库、做 schema 演化或关注 AI 辅助测试的读者尤其有价值;但它是单个项目的发布复盘,不是通用教程,迁移设计仍需结合自身系统约束取舍。

科研议题BAIR Blog

Intelligence is Free, Now What? <br> Data Systems for, of, and by Agents

这篇 BAIR 观点文章讨论了“智能几乎免费”后,数据系统将围绕 agents 重新定义的三类问题:为 agents 设计查询与分析接口、为 agents 构建长期运行与协作的底座、以及由 agents 反向合成可用的数据系统。作者结合已有研究指出,agentic speculation 会带来大量重复子查询,因此系统应支持共享扫描、多查询优化、近似回答、批量查询和更主动的性能反馈,而不再把 SQL 当作唯一交互形式。对于多 agent 场景,文章强调需要结构化记忆、面向任务的检索、并发编辑控制、故障恢复与协商机制,以避免上下文膨胀和 livelock 等问题。最后,作者讨论了用 agents 生成专用 OLAP 引擎、KV 存储乃至证明辅助的系统构造流程,但也指出规格不完备会导致 reward hacking,因此验证与测试是关键边界。整体上它是一篇研究路线图而非成熟方案,价值在于系统梳理了 agents 与数据系统共同演化的研究问题。

推荐收录,因为正文明确提出了“for/of/by agents”三条研究主线,并给出共享查询、结构化记忆、并发控制、系统合成与验证等可落地的技术方向。适合做数据系统、AI 基础设施和 agent 研究的选题地图,但应注意它是前瞻性观点文章,很多结论仍依赖作者正在推进的工作。

工程实践Simon Willison

sqlite-utils 4.0rc2, mostly written by Claude Fable (for about $149.25)

这篇文章记录了 sqlite-utils 4.0rc2 的发布前审查过程,核心是作者借助 Claude Fable 对 rc1 之后的变更做全面回查,并最终推动稳定版发布。文中最关键的发现是事务处理存在多个隐藏缺陷:例如 delete_where() 会留下悬挂事务、db.execute() 的写入语义与文档不一致、db.query() 对返回行与非返回行语句的处理存在副作用。作者据此重构并补齐了事务模型说明,增加了 db.begin()/db.commit()/db.rollback(),同时修正了 Python 3.12 autocommit 兼容性、migrations 原子性、upsert 校验和若干命令行为。文章还展示了多轮子代理、交叉模型复审和基于 changelog 的增量写作流程,并给出约 149 美元的推理成本估算。整体上它既是一次真实的发布事故预防案例,也是一份关于 AI 辅助代码审查与事务语义设计的可复用经验。

推荐收录,因为正文不仅讲了“用 AI 写代码”,而是明确暴露并修复了数据库事务、自动提交和 API 语义上的真实缺陷,证据充分、可验证。适合关注 SQLite/数据库工具、发布审查和 AI 辅助代码审查的读者,尤其有助于借鉴“先审文档、再审实现、用多模型交叉复核”的工作流。

工程实践知乎 - TencentDB腾讯云数据库

「腾讯云 NoSQL」技术之 Redis 篇:针对集群选举投票冲突的优化方案

文章系统剖析了 Redis/Valkey Cluster 在自动故障转移中的三段流程:PFAIL/FAIL 判死、故障副本拉票选举、以及新主广播后刷新路由,并解释了 currentEpoch、configEpoch、auth_timeout、auth_retry_time 和 data_age 的相互作用。作者指出,多个主节点同时故障时,多个副本会在同一 epoch 里并发拉票,因“每个 voter 同 epoch 只能投一票”而发生选票瓜分,导致 5 分片甚至 128 分片集群都可能长期无法自愈。腾讯云在 Valkey PR #1018 中引入 failed_primary_rank,以 shard_id 字典序为故障分片排序,在原有副本内排序基础上再叠加分片间错峰延迟,把抢票改成排队选举。文章还补充了 PR #1009 的快速失败兜底与 PR #762 的分片内错峰,说明这些优化都不改变一票一 epoch 的防脑裂原则,只是降低冲突概率并缩短恢复窗口。其价值在于把协议层的随机恢复,推进为大规模云环境下更确定的自愈流程;边界则是仍依赖 gossip 一致性,极端时序竞争下仍需快速失败兜底。

推荐收录,因为文章给出了从协议机制到线上故障现象的完整链路证据,并明确指出多主同时故障下的选票瓜分是 Cluster 自愈失败的根因。适合做 Redis/Valkey 高可用、分布式选举和故障转移设计的长期参考,尤其对云数据库和大规模集群运维很有迁移价值。

工程实践PlanetScale Blog

One Postgres cluster, many apps

文章介绍了如何在一个 PlanetScale Postgres cluster 中承载多个应用:先用逻辑数据库把 blog、todo 等数据与 schema 分开,再通过角色与权限控制实现彼此隔离。作者重点解释了 Postgres 默认对新数据库开放 PUBLIC CONNECT、以及需要显式 REVOKE/GRANT 才能把访问收紧到指定角色,这也是多应用共享集群时最容易踩坑的部分。随后文章给出用 PlanetScale API 创建角色、再在数据库内授予 CONNECT、CREATE 和 schema 权限的完整流程,并提醒读写与迁移职责最好拆分成不同角色。最后作者把这些步骤自动化到 Pulumi/IaC 中,展示如何把新增或删除应用简化为修改配置数组并重新部署。文章也明确边界:这种共享集群方案更适合 side project 和小规模应用,增长到高并发或大量用户时仍应迁移到独立集群。

文章直接给出了 Postgres 多逻辑数据库隔离、角色权限收紧和 IaC 自动化的可执行做法,不是泛泛介绍概念。适合需要在同一集群承载多个小应用、或想把数据库权限管理流程自动化的工程读者参考;但它也明确说明了规模上来后应切到独立集群。

工具笔记Simon Willison

simonw/browser-compat-db

这篇文章记录了作者把 Mozilla 的 mdn/browser-compat-data 兼容性数据仓库转换成一个约 66MB 的 SQLite 数据库的实践。作者借助 Claude Code 和 sqlite-utils 生成转换脚本,再用 Codex Desktop 编写 GitHub Actions 工作流,在构建后把数据库强制推送到一个独立的 orphan 分支。这样做的目的不是做可写数据库,而是利用普通 GitHub 仓库文件可通过 CDN 访问且带开放 CORS 的特性,方便浏览器端直接下载和在 Datasette Lite 中在线探索。文章的核心价值在于展示了“结构化数据仓库 + SQLite + 静态托管 + 前端可直接查询”的发布链路。它更适合静态、可再生成的数据集分发场景,不适合高频写入或需要事务服务化的系统。

文章给出了可直接复用的证据:SQLite 生成脚本、GitHub Actions 自动构建、orphan 分支静态发布,以及利用 GitHub CDN 的开放 CORS 让浏览器端直接访问。对需要发布可下载数据集、做前端只读查询或搭建轻量数据浏览器的工程实践很有参考价值。

工程实践Crunchy Data Blog

British Columbia, Time Zones, and Postgres

文章以不列颠哥伦比亚省时区规则变更为例,讨论了 PostgreSQL 中时间存储的核心陷阱:把未来的“本地意图”仅用 timestamptz 保存,会因 tzdata 更新而在查询时还原出错误的本地时间。作者进一步提出双列模式,将 local_time 和 timezone_name 作为事实源,再用触发器计算并维护 starts_at_utc,以同时满足本地语义、UTC 索引与约束检查的需求。文中还说明了这种方案的适用边界、tzdata 变更后的重算策略,以及 RFC 9557 目前并不能解决这类未来本地时间问题。

推荐收录,因为文章围绕真实的时区规则变更给出了可直接迁移到数据库设计中的方案,不只是泛泛讲时间处理。它对预约、日程、法务截止时间等需要保留未来本地意图的系统尤其有参考价值,也明确提醒了哪些场景仍应继续使用 plain timestamptz。

工程实践Cloudflare Blog

Scaling Security Insights: how we achieved a 10x increase in global scanning capacity

这篇文章复盘了 Cloudflare 为 Security Insights 扫描系统做的整体扩容:从每周/每两周扫描一次、部分免费用户未自动扫描,提升到峰值每秒 120 次以上的扫描吞吐,并将免费用户默认扫描和全量扫描频率提升到更高水平。作者按链路拆解了多个瓶颈,包括 Kafka 消费的 head-of-line blocking、Postgres 批量写入效率、跨地域 API 延迟导致的连接池耗尽,以及调度器造成的扫描洪峰,并逐一用批量并行、快慢车道、UNNEST/COPY 混合写入、active-passive API 和自适应限流等手段解决。文章的核心结论是:在大规模系统里,先理解现有架构和真实瓶颈,再针对性优化,往往比简单加机器、加分区或抬超时更有效。

推荐收录,因为它不是泛泛的“扩容故事”,而是完整展示了一个安全扫描平台在消息队列、数据库、调度和跨地域部署上的系统性性能治理。对做后端、基础设施、安全平台或高并发任务调度的读者来说,这篇文章提供了很强的可迁移方法论:如何定位瓶颈、如何权衡架构改动、以及如何用指标验证收益。

工程实践Datadog Engineering

When failover isn’t safe: Building high-availability PostgreSQL on Kubernetes

这篇文章复盘了 Datadog 在一次 reliability gameday 中发现的 PostgreSQL 故障切换不安全问题:表面上集群看似具备高可用能力,但在 Kubernetes 环境下,原有方案无法保证 failover 时的数据一致性与切换正确性。作者进一步说明了他们如何引入 Patroni 与同步复制,重新设计状态管理、领导者选举和故障转移流程,以提升 PostgreSQL 集群在容器编排环境中的可用性与安全性。文章的重点不只是“如何搭建”,而是明确了 stateful 数据库在 K8s 上做 HA 时必须面对的一致性、自动化与运维验证边界。

推荐收录,因为它不是泛泛介绍 PostgreSQL 或 Kubernetes,而是基于真实演练暴露出的故障切换风险,给出了一套有约束条件的高可用改造思路。对于需要在容器平台上运行状态型数据库、设计故障转移机制或做可靠性演练的读者,这篇文章有很强的迁移价值。

工程实践知乎 - 胡津铭

Caliby:面向 AI Agent 的嵌入式高性能向量数据库,我们把它开源了

这篇文章介绍了一个面向 AI Agent 和 RAG 场景的嵌入式向量数据库 Caliby,核心卖点是把文本、向量、元数据统一放进同一套进程内引擎,并通过 HNSW、DiskANN、IVF+PQ 三类索引覆盖不同规模与延迟需求。文章还说明了它在磁盘持久化、SIMD 加速、Python 绑定、批量并发检索上的设计思路,并给出与 pgvector、FAISS 的性能对比,强调“pip install 即可用”的本地化部署体验。需要注意的是,正文更偏项目发布与产品介绍,性能数字和结论主要来自作者展示,适合作为选型与架构参考,但不宜当作严谨基准报告直接引用。

推荐收录,因为它不是单纯的产品宣传,而是把“AI Agent 需要什么样的数据引擎”这个问题具体化到了嵌入式、持久化、索引选择和文本/向量统一管理等工程决策上。对做向量检索、RAG、Agent 记忆系统或本地优先工具的读者,这些设计取舍和场景划分具有可迁移价值。

工程实践Yelp Engineering

Zero downtime Upgrade: Yelp’s Cassandra 4.x Upgrade Story

文章复盘 Yelp 数据库可靠性团队如何将一千多台 Cassandra 节点从 3.11 升级到 4.1,并做到全程零停机。作者先说明 Cassandra 在 Yelp 中承载主数据与衍生数据,且集群运行在 Kubernetes 上、由 operator 编排,因此升级必须兼顾状态迁移、回滚和服务连续性。文中强调此次升级的驱动力不仅是版本更新,还包括更好的可观测性、可靠性和性能,且决策参考了公开基准。整体上,它展示了大规模有状态服务在成熟运维体系下的分批规划、验证与上线思路,但其可迁移性明显依赖现有自动化、编排和回滚能力。

有明确工程证据:超过一千台 Cassandra 节点、Kubernetes + operator、3.11 到 4.1、零停机升级,说明这是大规模状态系统的真实复盘。适合做数据库可靠性、滚动升级和有状态服务编排的参考,但方法强依赖现有自动化与回滚机制,迁移时需评估自身条件。

工程实践Datadog Engineering

When upserts don’t update but still write: Debugging Postgres performance at scale

这篇文章复盘了 Datadog 在高流量场景下排查 Postgres 性能退化的过程:一次 upsert 操作表面上没有“更新”数据,却仍然引发了磁盘写入翻倍。作者从现象出发,结合数据库监控与写放大分析,最终定位到 Postgres 的 WAL 行为和 upsert 语义带来的隐藏成本。文章进一步说明,问题并不在业务逻辑本身,而在查询写法与存储引擎内部机制的交互。团队通过重写查询,去掉不必要的写入路径,恢复了写放大和 IO 压力的正常水平。它的价值主要在于揭示了高并发写场景下,SQL 语义、日志机制和性能表现之间的非直观关系,但结论对 Postgres 语义和负载形态有明显依赖。

推荐收录,因为文章给出了明确的工程证据:高频 upsert 导致磁盘写入翻倍,且根因落在 Postgres WAL 与查询语义的组合效应上,而不是泛泛的“数据库慢”。适合做数据库性能优化、线上故障定位和写放大分析的参考案例,但迁移时要注意它强依赖 Postgres 的实现细节。

工程实践Crunchy Data Blog

Postgres Serials Should be BIGINT (and How to Migrate)

这篇文章讨论了 Postgres 中自增主键从 SERIAL/INT 升级到 BIGINT 的必要性,核心理由是 INT 只有约 21 亿上限,而 BIGINT 基本不会溢出。作者进一步说明 BIGINT 在很多行布局下并不比 INT 更占空间,因为 PostgreSQL 的行对齐和填充会抵消所谓的 4 字节节省,因此用 BIGINT 的长期成本通常很低。文章还对比了 UUID 的适用场景,认为跨系统或需要公开暴露 ID 的场景可以选 UUID,但纯数据库序列号未必需要放弃整数。随后给出了一套可在线执行的迁移方案:新增 BIGINT 列、触发器同步、分批回填、定期 VACUUM、并发建唯一索引、处理外键引用表,再在一个短事务里完成 atomic swap。文中也强调了边界条件:需要预留短暂排它锁、先在非生产环境验证批次大小和回填策略,并确保序列、外键和主键约束在切换后都能正确接管。

推荐收录,因为文章直接给出了从 INT 到 BIGINT 的完整 PostgreSQL 迁移链路,包含分批回填、NOT VALID 外键、并发建索引和原子切换等可复用证据。适合负责数据库演进、线上改表或容量规划的后端/DBA 读者,主要价值是把一次高风险 schema 变更拆成可验证的操作步骤。

技术文章Andy Pavlo Database Blog

Databases in 2025: A Year in Review

Andy Pavlo 撰写的 2025 年数据库年度回顾,以 PostgreSQL 的持续主导为主线,梳理全年行业格局与技术动向。文中记录了 Databricks 以 10 亿美元收购 Neon、Snowflake 收购 CrunchyData、微软推出 HorizonDB 等交易,并分析 Multigres、Neki、PgDog 三个分布式分片项目对 PostgreSQL 水平扩展能力的意义。作者还评述各 DBMS 竞相推出 MCP 服务器接入 LLM/Agent 及其权限与防护风险、MongoDB 起诉 FerretDB 的专利商标纠纷,以及 FastLanes、F3、Vortex、AnyBlox 等新列式文件格式对 Parquet 的挑战。文章同时汇总全年收购、合并与融资清单,并附作者点评与历史脉络考证。其内容以行业观察与主观判断为主,并非技术教程,趋势预测带有个人立场,读者需结合原始资料核实。

推荐收录:作者为 CMU 数据库教授,该系列已成为数据库领域公认的年度权威综述,文中对 PostgreSQL 生态并购、MCP 接入 LLM 的安全隐患、列式文件格式竞争给出了有据可查的事实与判断。适合数据库工程师、架构师与研究者快速建立年度技术脉络,可作为长期索引;但内容偏向行业观察与个人观点,具体机制仍需回到原始资料与论文核实。

工程实践Crunchy Data Blog

Postgres 18 New Default for Data Checksums and How to Deal with Upgrades

文章介绍了 Postgres 18 将数据校验和(data checksums)设为 initdb 的默认开启项,强调其核心价值是及早发现磁盘页的静默损坏。作者先解释校验和如何在写入数据页时生成、存入页头,并在读取时重新计算比对,从而把原本难以察觉的数据腐败转化为可报警错误。随后文章说明这一默认变化对新建集群是纯收益,但会影响使用 pg_upgrade 的大版本升级,因为新旧集群的校验和开关必须一致。文中给出两条应对路径:升级时可用 --no-data-checksums 保持兼容,或提前用 pg_checksums 为现有集群补开校验和,但后者通常需要停机或通过副本切换来降低影响。整体适用于自建 PostgreSQL 运维、升级规划和备份完整性管理场景。

文章直接给出 Postgres 18 默认行为变化、pg_upgrade 兼容条件和 pg_checksums 处理方案,证据明确且可操作性强。适合数据库运维、平台工程和升级规划读者,尤其对自建集群的完整性保障与停机权衡有长期参考价值。

工程实践Datadog Engineering

Breaking up a monolith: How we’re unwinding a shared database at scale

这篇文章讲 Datadog 如何在大规模生产环境中拆解一个共享数据库,核心目标是把原本耦合的业务边界重新切开,同时尽量不影响线上稳定性。作者强调先定义清晰的所有权边界,再通过分阶段迁移、风险隔离和回滚预案降低改造成本,而不是一次性“硬拆”。文中还介绍了用于自动化迁移、校验一致性和减少人工操作的配套工具,以保证解耦过程可重复、可持续。它的重点不在数据库原理本身,而在多团队共用核心存储时如何平衡组织边界、迁移风险和工程效率。其适用前提是已有足够的监控、测试和发布控制能力,若系统变更链路薄弱,收益会被迁移复杂度抵消。

文章直接围绕“shared database at scale”的拆分实践展开,给出了边界划分、风险控制和自动化工具这三类可迁移做法,明显属于可长期参考的工程案例。适合正在做服务解耦、数据库分片/迁移或多团队协作治理的读者,但需要注意其前提是具备较成熟的发布与验证体系。

工程实践Yelp Engineering

Revenue Automation Series: Testing an Integration with Third-Party System

文章来自 Yelp 的 Revenue Automation 系列,聚焦在收入数据管道与第三方系统集成时的测试和验证方案。作者先说明现状:原本依赖 Redshift Connector 在报表发布后再同步到数仓,导致验证数据要延迟约 10 小时才能可见,严重影响迭代效率。基于这一约束,文章讨论了如何设计更稳健的生产测试与集成策略,以便在复杂转换逻辑下尽早发现问题。它的核心价值不在于单点工具,而在于围绕批处理数仓、外部系统联调和回归验证建立更短反馈闭环。该经验对类似的数据工程、财务/收入类流水线和第三方集成场景具有较强迁移性,但对实时系统或纯应用单测场景的直接参考有限。

文中直接给出旧方案通过 Redshift 同步带来约 10 小时验证延迟,这是重新设计测试链路的明确工程证据。适合做数据管道、数仓联调和生产验证的团队阅读,可借鉴其将反馈时延作为核心约束来优化测试策略的思路。

工程实践PlanetScale Blog

Anatomy of a Throttler, part 3

这篇文章是三部曲的收官篇,集中讨论数据库限流器的客户端识别、优先级控制和规则边界。作者提出,限流器应能区分具体作业或作业类别,否则难以做监控、审计和针对性调度;同时,真正安全的“优先级”通常不是直接放行某个客户端,而是通过对其他客户端提高拒绝率来实现。文中进一步分析了豁免、不同指标下的限流与饥饿风险,指出对某些作业单独放宽指标本质上接近豁免,可能让其他作业长期得不到执行机会。作者也强调,豁免并非绝对错误,在故障修复、系统关键内部流量或短时影响可接受时可以使用,但应设置失效时间。最后,文章对比了协作式限流与代理式强制限流,说明后者更难绕过,但也更依赖客户端/连接层暴露足够的身份信息。

文章直接给出了生产环境限流器的核心设计证据:客户端身份、优先级、豁免、饥饿风险和协作/强制两种模型的取舍。适合做数据库运维、平台工程和系统设计参考,尤其对需要控制批处理、迁移和大规模任务的场景有可迁移价值。

工程实践PlanetScale Blog

Anatomy of a Throttler, part 2

本文继续分析 throttler 的部署形态,先比较单体服务、独立多实例、主备切换以及引入 agent/API 的方案。作者指出,加入采集代理或跨节点协作后,系统会从单一同步组件演变成分布式多组件系统,复杂度、权限边界和版本兼容问题都会上升,同时采样间隔叠加也会让指标更陈旧。随后文章给出分布式 throttler 的几种切分方式:按可用区、按功能、按主机或按服务粒度,并以 Vitess tablet throttler 为例说明如何在 shard 范围内聚合 replica lag,让 primary 代表整个 shard 做限流判断。最后,文章讨论如何降低 throttler 自身开销,包括客户端退避、空闲时降低采样频率或休眠、以及在无大任务时减少 heartbeat 生成,避免 binlog、磁盘和备份成本被额外放大。其边界在于,这些策略都依赖对业务负载形态、重试行为和一致性要求的准确预判。

收录价值明确:文章直接比较了 throttler 的单体、分布式与 agent 化方案,并用 Vitess 的 shard 级限流给出可落地的架构证据。适合做 MySQL/Vitess、SRE 和基础设施设计参考,但需要注意其结论高度依赖心跳粒度、轮询频率和客户端重试假设。

技术文章PlanetScale Blog

B-trees and database indexes

文章系统解释了 B-tree 与 B+tree 的结构差异、节点有序性、查找/插入路径,以及它们为何特别适合磁盘上的持久化数据。作者进一步结合 InnoDB 说明:表数据和二级索引都会落到 B+tree 上,查询通常需要先查索引再回表,因此访问的页数直接决定性能。文章重点比较了自增整数、UUIDv4、UUIDv7 等主键选择对树深度、页分裂、写放大和数据局部性的影响,指出随机键会导致插入路径不可预测、叶子分散、缓存命中更差,而顺序键更利于保持浅层和连续访问。文中还说明了页大小、buffer pool 和表宽度对单页可容纳行数的影响,并给出主键大小与可扩展性的权衡。整体适合理解数据库索引底层机制,但内容主要面向 MySQL/InnoDB 场景,结论迁移到其他存储引擎时需结合其页布局和实现差异。

文中直接给出 B+tree、InnoDB 页和二级索引回表的工作方式,并用主键选择解释性能差异,证据充分、可验证。适合数据库开发、后端和性能优化读者,尤其是需要评估主键设计、索引布局和随机写放大风险的场景。

工程实践PlanetScale Blog

Instant deploy requests

文章介绍了 PlanetScale 为符合条件的 deploy request 新增的“instant deployment”能力,用于把数据库 schema 部署时间从小时级压缩到接近秒级。其核心前提是请求中的所有变更都必须能被 MySQL 的 INSTANT DDL 满足,例如符合条件的 ALTER TABLE,以及可选的建表、删表、建视图、改视图和删视图。系统会在部署前自动判断是否满足条件,并让用户在 instant deployment 与默认的 Online DDL 之间做显式选择。文章同时强调了边界:instant deployment 不可 revert,在某些负载下迁移表仍可能出现数秒级锁,因此它只适用于少量明确可瞬时执行的 schema 变更。

推荐收录,因为文章给出了数据库 schema 变更加速的具体判定条件、系统预评估机制和不可忽略的风险边界,而不是单纯宣传新功能。适合做数据库平台、迁移系统和 SRE 设计参考,尤其对需要在“速度”和“可回滚/稳定性”之间取舍的场景有直接迁移价值。

工程实践PlanetScale Blog

Increase IOPS and throughput with sharding

文章围绕数据库在云上扩容时最容易被忽视的 IOPS 和吞吐量成本展开,先解释 AWS EBS 中 IOPS 的计量方式、顺序/随机读写对有效带宽的影响,以及 gp3、io1、io2 的配额与价格差异。随后作者用 RDS、Aurora 和 PlanetScale 的月费对比,说明当单体数据库从中等规模增长到 8 倍需求时,单机方案往往要付出显著更高的 I/O Premium。文章的核心观点是:对 I/O 密集型数据库,分片可以把计算、存储和 I/O 压力拆散到多个 primary 上,从而继续使用更便宜的存储层。文中还指出分片带来的额外收益包括故障隔离、备份更快和长期线性扩展,但没有给出实际压测结果,因此结论更偏成本与架构层面的比较,而非纯性能评测。

文中直接用 EBS 的 IOPS/吞吐限制和三种数据库方案的月费对比,证明了单体扩容会迅速推高 I/O 成本,而分片能把需求摊平到多个 shard 上。适合做数据库容量规划、云成本评估和分片选型的读者;但价格结论依赖区域、流量形态和分片键设计,落地时需要按自身 workload 复算。

工程实践PlanetScale Blog

Tracking index usage with Insights

这篇文章介绍了 PlanetScale Insights 新增的“索引使用跟踪”能力,目标是在真实生产流量中观察每个查询模式实际命中了哪些索引,以及这种使用如何随时间变化。作者先比较了 EXPLAIN、MySQL performance schema 等现有手段,指出它们要么只能分析单条手工输入的查询,要么只能提供服务器级累计计数,难以关联到具体查询模式和趋势。随后文章给出实现思路:利用 InnoDB 的索引初始化流程,在查询执行过程中记录被选中的索引,将结果随响应返回到 VTGate,再按查询模式聚合并以时间序列方式写入 Insights 流水线。这样可以在几乎不增加 MySQL 开销的前提下,获得覆盖全部查询的索引使用统计,并支持反向检索“哪些查询在用某个索引”或“哪些查询完全未命中索引”。但它也明确了边界:索引信息目前只对 SELECT 统计,删除索引前仍需独立核实 UPDATE/DELETE 的使用情况。文章的价值在于把数据库可观测性、查询归因和索引治理串成了一套可落地的方法。

收录价值明确:文章不仅解释了功能,还给出从 MySQL/InnoDB 到 VTGate 和 Insights 的完整实现链路,以及为何 EXPLAIN 和 performance schema 不足以支撑生产趋势分析。适合做数据库性能优化、索引治理和可观测性设计的参考,但需注意它只覆盖 SELECT 场景。

工程实践PlanetScale Blog

Zero downtime migrations at petabyte scale

文章系统拆解了 PlanetScale 在 TB 到 PB 级 MySQL 迁移中实现零停机的流程:先做一致性且不加锁的快照,再持续复制 binlog 追平增量,并用 VDiff 对源端与目标端做全表校验。切流阶段通过 VTGate 缓冲请求、等待复制追平、建立反向复制链路,使切换可在秒级完成且可随时回滚。作者进一步说明了底层依赖 Vitess 的 VReplication、MoveTables、路由规则、序列和 sidecar 元数据,展示了按表、按分片串并行协作的实现方式。文章也明确了适用边界:切流前经 PlanetScale 转发会引入额外网络开销,建议使用只读副本作为迁移源;而超过约 250GiB 的库通常应结合分片来控制成本与性能风险。

推荐收录,因为文章不是泛泛谈“零停机”,而是给出了快照、GTID、binlog 追平、VDiff 校验、反向复制和请求缓冲等完整证据链。适合做数据库迁移、分库分表和在线切流的工程参考,尤其对需要评估回滚能力与迁移风险的团队很有迁移价值。

工程实践PlanetScale Blog

Faster backups with sharding

文章系统解释了 PlanetScale 在 Vitess 体系下的备份流程:先从对象存储取回上一次备份,恢复到专用 VTBackup 实例,再让其通过主库做短暂追平,最后生成新的全量备份写回 S3/GCS。作者强调,单库越大,顺序备份越容易被网络与恢复耗时拖慢;而分片后每个 shard 可并行执行同样流程,从而把总体备份时间显著压缩。文中用 161GB 未分片库与 20TB、32 分片库对比,说明总体吞吐提升主要来自并行化,而非单分片传输速度大幅上涨。文章还补充了备份的工程意义:它不仅用于灾难恢复,也用于新副本初始化、误删恢复和 Vitess 的时间点恢复。适用前提是数据库已分片且备份/恢复链路能并行调度;若是单体库或分片不均,效果会明显打折。

推荐收录,因为文章给出了可复用的备份链路设计、分片并行化带来的吞吐收益,以及备份在副本初始化和误删恢复中的真实作用。对做数据库基础设施、MySQL/Vitess、备份恢复或大规模系统运维的读者尤其有参考价值,但前提是系统本身具备分片与并行恢复能力。

工程实践PlanetScale Blog

Building data pipelines with Vitess

文章围绕 Vitess 在数据管道中的用途展开,先说明 Vitess 更擅长支撑 OLTP,而分析、报表和跨系统同步这类 OLAP/集成场景需要借助 CDC/ETL 来补足。作者重点介绍了 Vitess 的 VReplication 与 VStream 能力:通过 VTGate 暴露统一的变更流,把一个可能由大量 shard 组成的逻辑库抽象成单一数据源。文中进一步解释了 Debezium、Airbyte、Fivetran 等工具如何依赖这些底层原语把 Vitess 的变更传播到数仓或其他系统。文章还给出可运行的本地示例,展示快照、增量变更和分片后的统一流输出,帮助读者理解复制与重分片过程中的事件形态。其边界在于它更偏架构说明和实践入口,较少讨论容错、延迟、乱序等生产级细节。

文中直接给出了 Vitess 的 VStream/VReplication 作为 CDC 基础、以及 Debezium/Airbyte/Fivetran 的对接方式,证据明确且可操作。适合需要在分片 MySQL 上构建同步、数仓或跨系统集成的工程师,迁移价值在于理解“统一变更流+连接器”的实现路径,但生产细节仍需补充验证。

技术文章PlanetScale Blog

The State of Online Schema Migrations in MySQL

文章系统梳理了 2024 年 MySQL 在线 schema 变更的主要方案,重点比较了原生 INPLACE、INSTANT 与第三方工具的适用边界。作者指出,INPLACE 虽然在主库上可让 DML 继续执行,但会大量消耗 CPU/IO、占用额外磁盘,并且在复制链路上会把延迟放大到不可接受的程度。INSTANT 在支持范围内几乎“瞬时”完成,且对副本友好,但它主要覆盖元数据级变更,无法处理类型修改、索引/主键/外键变更、字符集和分区调整等常见需求,删除列还带来数据丢失与查询兼容风险。对于大多数真实生产迁移,文章认为 gh-ost、pt-online-schema-change、Vitess、spirit 这类影子表方案仍是更稳妥的选择,因为它们能限速、可中断、兼容更多 DDL,并且 Vitess 还把可回滚性作为一等能力。整体结论是:能用 INSTANT 时优先用,但面向绝大多数复杂迁移,第三方在线 schema 工具仍是主流答案。

文章直接对比了 MySQL 原生 DDL 与第三方在线迁移工具的行为、成本和失败边界,给出了明确的选型依据,而不是泛泛介绍功能。适合负责数据库架构、上线变更和可靠性治理的工程师参考,尤其能迁移到“如何判断某个 schema 变更该不该用原生 DDL”的决策场景。

工程实践PlanetScale Blog

Optimizing aggregation in the Vitess query planner

这篇文章复盘了 Vitess 查询规划器中的一次聚合优化:一个包含 join、group by 和 order by 的查询因为无法把聚合下推到 MySQL,导致 VTGate 需要拉取大量数据并可能触发 OOM。作者先分析初始计划和树重写过程,说明 ordering under aggregation 过早执行时会把排序卡在 join 上游,从而阻断聚合下推。随后他利用规划器的阶段机制,延后该重写器直到 split aggregation 阶段,再让聚合穿过 join 下推到各个分片。最终 VTGate 只需合并各分片返回的部分聚合结果,而不是承担全量数据排序和聚合。文章的边界也很明确:该优化依赖重写阶段的时机控制,属于规划器内部顺序与算子可交换性之间的权衡。

文中给出了真实的 OOM 问题、初始执行树、重写前后计划和最终下推结果,是典型的数据库查询优化工程案例。适合做查询规划器、分布式 SQL 引擎和算子重写设计的参考,尤其对需要处理聚合下推与阶段控制的读者很有迁移价值。

技术文章PlanetScale Blog

Dealing with large tables

文章以一个健身应用中的 exercise_log 大表为例,解释为什么少数高增长表会先成为数据库瓶颈:写入频繁、历史数据持续被查询,最终把存储、内存和 IO 都推到极限。作者先讨论纵向扩容,即通过增加 CPU、内存和磁盘来延长单机数据库的可用寿命,但指出当数据达到多 TB 时,成本和资源争用会迅速上升。接着介绍垂直分片,把大表从主库中拆出到独立 keyspace,并借助 Vitess 的 MoveTables 平滑迁移和切流,使主业务表与日志表可以分别扩展。最后给出水平分片方案:按 user_id 做哈希分布、使用 sequence 生成全局 ID,再通过 Reshard 把单表扩到多个 shard。文章还总结了分片带来的吞吐提升、备份加速、故障隔离和成本优化,同时提醒分片键选择会直接影响查询局部性和性能。

推荐收录,因为文章明确给出了大表扩容的三级演进路径,并直接展示了 Vitess 的 MoveTables、Reshard 和分片键设计等可操作证据。适合做数据库架构、MySQL 扩容和日志/消息类大表治理的参考,但读者需要结合自身读写模式谨慎选择分片键。

技术文章PlanetScale Blog

Sharding strategies: directory-based, range-based, and hash-based

这篇文章系统介绍了数据库分片的三种常见策略:directory/lookup-based、range-based 和 hash-based,并用示例说明它们如何根据 shard key 将数据分散到不同分片。作者分别分析了每种方法的优缺点:目录式分片便于按业务规则精确路由,但依赖额外的查表步骤,且容易因数据倾斜或热点访问造成单分片压力;范围分片实现直观,但如果范围划分不合理,很容易出现分布不均,需要通过 reshard 调整;哈希分片通常能获得更均匀的数据分布,代价是要做哈希计算,并且仍需谨慎选择高基数且符合访问模式的 shard key。文章还强调,分片方案不是点击按钮即可完成,真正落地时要结合数据分布、访问模式和后续扩容计划一起考虑。PlanetScale 的倾向是把 hash-based 作为默认选择,因为它通常最均衡、复杂度也更低,但这并不意味着它适合所有场景。

文章直接给出了三类分片策略的机制、优缺点和适用边界,属于数据库扩展的基础参考,而不是单纯的产品介绍。适合正在设计 MySQL/分库分表方案、评估 shard key 或做容量规划的读者阅读。

技术文章PlanetScale Blog

Achieving data consistency with the consistent lookup Vindex

文章系统解释了 Vitess 的 Vindex 机制,重点聚焦于一致性查找 Vindex(consistent lookup vindex)如何在分片数据库中兼顾路由效率与数据一致性。作者先说明普通 lookup vindex 通过维护二级索引表,把查询从全分片扫描收敛到单分片命中;随后进一步指出,若主表与索引表分属不同分片,直接做跨分片事务会引入昂贵的 2PC。为此,Vitess 采用 Pre、Main、Post 三条连接按固定顺序提交/回滚,并通过加锁与事务编排来处理插入、删除、更新中的一致性问题。文章用删除后残留 orphan row、再次插入触发唯一键冲突等例子说明:即使 lookup 表短暂不一致,查询结果仍能保持与主表一致。它也明确了边界与限制,例如同值更新会产生锁等待,且同一事务内先删后插仍可能遇到该问题。

文章直接给出了 Vitess 一致性 lookup vindex 的提交顺序、锁定策略和失败恢复例子,属于可复用的分片一致性设计经验。适合做分库分表、MySQL 分片路由或数据库中间件设计参考,但其细节强依赖 Vitess 语义,落地时需注意同值更新和同事务删插的限制。

技术文章PlanetScale Blog

The MySQL adaptive hash index

这篇文章系统解释了 MySQL InnoDB 中的自适应哈希索引(AHI)是如何在 B-tree 索引之上再加一层内存加速的。作者先回顾了 B-tree、InnoDB buffer pool 和普通哈希查找的差异,说明 InnoDB 虽然不支持磁盘上的 HASH 索引,但会在运行时为高频访问的索引值或前缀构建 AHI 条目,把键映射到 buffer pool 中的数据位置。文章还说明 AHI 会根据访问模式和 buffer pool 命中情况自动增减,适合重复查同一批热点值的场景,不适合缓存很小或数据访问很分散的负载。通过 3.9 亿行表上的基准测试,作者展示了开启 AHI 后约 16% 到 20% 的 QPS 提升,并用 InnoDB 状态输出验证了哈希搜索确实被使用。结论强调:AHI 不是通用银弹,但在高并发、热点明显且索引较深的系统中,哪怕单次收益不大,也可能显著影响整体延迟和服务器容量。文章的边界也很清楚:收益高度依赖工作负载、buffer pool 大小和重复访问模式。

推荐收录,因为文章不仅解释了 AHI 的工作机制,还给出了 buffer pool、哈希命中统计和真实基准测试结果,能帮助读者判断它为什么快、何时有效。适合做 MySQL/InnoDB 性能优化、热点查询分析和存储引擎原理参考;但收益强依赖访问模式,不能把文中的提升直接外推到所有业务。

工程实践PlanetScale Blog

Introducing global replica credentials

文章介绍了 PlanetScale 新增的 global replica credentials:用户只需一套复制库密码,即可在全球范围内自动路由到最近的只读副本,并在同一区域内对多个 replica 做负载均衡。作者说明了其默认拓扑是一个 primary 加多个跨可用区 replica,而新凭据可以在新增或删除只读区域时自动更新路由,无需修改应用代码或重新连接。文中进一步拆解了 PlanetScale Global Network 的工作方式:在边缘层终止 MySQL 与 TLS、进行连接池化,并通过低延迟 DNS 选择就近入口。实现上把 Credential、Route 和 Endpoint 分离,Route 由 etcd 监听并按实时延迟排序,从而把下一跳决策稳定地落到最优副本。该方案的价值主要体现在跨地域读扩展和连接管理简化上,但也明显依赖 PlanetScale 自身的全局网络与内部路由体系,通用性受平台约束。

文中给出了凭据、路由、端点三层拆分,以及边缘终止 MySQL/TLS、按延迟排序副本的具体实现证据,不是简单的产品宣传。适合做数据库代理、跨地域读扩展和连接层设计的参考,但迁移时要注意它强依赖 PlanetScale 的全局网络基础设施。

工程实践PlanetScale Blog

How PlanetScale makes schema changes

文章介绍了 PlanetScale 如何把数据库 schema 变更做成一套可自动化、可回滚、对线上流量友好的工程流程。核心思路是把代码发布与 schema 迁移解耦:应用代码和数据库结构不再要求原子同时上线,而是要求双方都能兼容当前与未来版本。实现上,他们利用 Vitess 的在线 schema change 和 PlanetScale 的 safe migrations,在不阻塞生产流量的前提下执行变更,并通过队列保证多人并发修改时的顺序与组合安全。为了适配自家 Rails 应用,团队还用 GitHub Actions 写了拉取请求机器人,自动识别 schema 变化、创建分支、运行迁移、发起 deploy request,并根据变更类型给出前后置部署顺序建议。文章的边界也很明确:这套流程强依赖在线迁移工具和应用侧的向后兼容设计,适合中大型数据库和频繁发布团队,简单项目未必需要如此复杂。

文中直接展示了从 PR 检测、迁移执行到队列合并的完整 schema 变更流水线,并明确说明了为何要把代码与数据库发布解耦。对使用 MySQL/Vitess、需要高频改表或想减少迁移阻塞的团队,这是一篇可直接借鉴的工程实践。

技术文章PlanetScale Blog

Identifying and profiling problematic MySQL queries

这篇文章系统介绍了如何用 MySQL 原生能力定位并剖析性能异常查询,适合在大规模数据库和复杂业务负载下做问题排查。作者先从 performance_schema 的 events_statements_summary_by_digest 入手,借助 avg_timer_wait、count_star 等指标找出高代价语句,再结合 sys 库中的 statements_with_runtimes_in_95th_percentile、statements_with_full_table_scans 等视图,从“慢查询”和“全表扫描”两个角度缩小范围。随后文章用 EXPLAIN ANALYZE 展示如何根据执行计划中的 cost、rows、table scan 和索引回表路径判断瓶颈是否来自索引缺失或 SQL 改写空间。最后通过开启 instruments、consumers 和 history 记录,利用 stage 历史表拆分一次查询在执行、优化、加锁等阶段的耗时,并提醒这些监控手段会带来一定开销,需要按需选择范围。文章也提到 PlanetScale Insights 可将同类分析可视化自动化,但核心方法仍然适用于原生 MySQL 环境。

推荐收录,因为文章直接给出了 performance_schema、sys、EXPLAIN ANALYZE 和 stage profiling 的完整排查链路,而不是停留在“查慢 SQL”的泛泛建议。它特别适合 DBA、后端和平台工程师在生产环境中定位索引缺失、全表扫描和执行阶段耗时问题,方法可迁移性强,但需要注意 profiling 本身有一定开销。

技术文章PlanetScale Blog

The Problem with Using a UUID Primary Key in MySQL

本文系统解释了 UUID 各版本的结构差异,并将讨论重点落在 MySQL 中把 UUID 作为主键时的代价。作者通过 B+Tree 索引、页分裂和 InnoDB 页填充机制说明:随机 UUID 会打乱主键顺序,导致插入时更频繁地重平衡索引,从而拖慢高写入场景的性能。文章进一步指出,UUID 以字符串形式存储会显著放大主键和二级索引体积,即使用 BINARY(16) 也仍比自增整数更占空间。针对这些问题,作者给出几类缓解方案,包括改用二进制存储、采用有序 UUID 版本(如 v6/v7)、利用 MySQL 的 UUID_TO_BIN swap flag,或直接选择 Snowflake、ULID、NanoID 等替代 ID 方案。整体结论是:UUID 能提升分布式唯一性,但在 MySQL 中并非默认的最优主键选择,是否采用应结合写入模式、索引数量和存储成本综合判断。

推荐收录,因为文章不仅说明“UUID 不适合当主键”的结论,还用 B+Tree、页分裂、二级索引膨胀和页利用率等机制给出直接证据。适合做数据库设计、主键选型和性能排障的长期参考,尤其对需要在分布式唯一性与写入性能之间权衡的工程场景很有迁移价值。

工程实践PlanetScale Blog

Introducing schema recommendations

文章介绍了 PlanetScale Insights 新增的 Schema recommendations 功能,目标是基于生产流量自动给出可直接执行的 MySQL 架构优化建议。作者说明系统如何结合表结构变更事件、近期查询表现、Vitess 解析器和列基数统计,生成索引、冗余索引清理、主键 ID 耗尽预警和未使用表删除等建议。其核心特点是把推荐结果以 DDL 形式输出,并支持先在分支上验证,再安全发布到生产。文中还给出新增索引的完整示例,展示了随着数据量增长,p50 延迟上升后如何通过推荐索引显著降低查询时间。需要注意的是,这类建议依赖近期查询与统计信息,仍需结合业务语义、写入成本和迁移风险人工评估。

文章不仅是功能发布,还给出了推荐系统的判定信号、实现链路和落地流程,尤其包含查询解析、基数估计与分支验证这些可迁移的工程细节。适合做数据库性能优化、自动化运维和架构诊断的参考,但读者仍需结合自身业务负载与迁移约束来使用这些建议。

工程实践PlanetScale Blog

Amazon Aurora Pricing: The many surprising costs of running an Aurora database

这篇文章系统拆解了 Amazon Aurora(以 MySQL 工作负载为主)的计费构成,指出它远不只是“选个实例”这么简单,而是要同时评估实例规格、预留实例折扣、副本数量、存储模式、跨可用区/跨区域流量、备份保留、监控和代理层等多项费用。作者特别说明了 burstable 与 memory-optimized 的差异、标准存储与 I/O-optimized 的取舍,以及当 I/O 费用占比超过一定阈值时,I/O-optimized 才可能更划算。文章还把读写副本、Global Database、RDS Proxy、蓝绿部署、自动备份和 Performance Insights 逐项拆开,说明这些“高可用/可运维能力”往往会直接放大账单。最后,文章以 PlanetScale 的定价和托管能力作对比,强调其在连接池、跨区复制、变更管理和监控上的简化与打包,但整体内容对 Aurora 成本建模尤其有参考价值;局限在于只覆盖 Aurora 非 Serverless 场景,且比较部分带有明显产品立场。

推荐收录,因为它不是泛泛介绍云数据库,而是把 Aurora 的主要成本项逐条展开,给出了实例、副本、I/O、流量、备份和监控的实际计费视角。适合做数据库选型、云成本估算和高可用架构评审时参考,但读者也需注意文中 PlanetScale 对比部分存在产品宣传倾向。

技术文章PlanetScale Blog

Three common MySQL database design mistakes

这篇文章围绕 MySQL 数据库设计中的三个常见错误展开:字段类型选得过小或过大、索引缺失或冗余、以及半结构化数据存储方式不当。作者用一个车联网系统的真实案例说明,ID 列早期采用 INT 可能在业务增长后迅速逼近上限,最终甚至会威胁线上可用性;同时也举了 VARCHAR 过短导致写入失败、字段类型过宽造成额外存储浪费的例子。针对索引,文章解释了缺少索引会让大表查询退化为全表扫描,而过多或重复索引又会增加存储和写入维护成本。对于 JSON 数据,作者强调应优先使用 MySQL 原生 JSON 类型,而不是用 TEXT 直接存字符串,因为前者支持更高效的二进制存储、按字段查询和基于 JSON 内容建索引。结尾还提到通过把有符号整型回绕到负数区间临时扩容 ID 的权宜之计,并指出数据库设计必须结合增长预估和业务边界来权衡。

文章给出了字段类型、索引和 JSON 存储三个维度的具体反例与后果,不是泛泛而谈,而是能直接指导 MySQL 表结构设计和性能排查。适合后端开发、DBA 和做系统容量规划的读者参考,尤其对需要在增长、存储和写入成本之间做取舍的场景很有迁移价值。

工程实践PlanetScale Blog

PlanetScale branching vs. Amazon Aurora blue/green deployments

文章以 Amazon Aurora 的 blue/green deployment 与 PlanetScale 的 branching 为主线,对比两种“复制环境后再切换”的数据库变更方式。它先解释 Aurora 如何通过克隆集群、binlog 同步和 switchover 完成维护,再说明 PlanetScale 基于 Vitess 的分支本质是独立集群,借助 deploy request、ghost table 和滚动升级来实施 schema 变更与版本升级。文中进一步比较了成本、回滚、数据一致性和停机时间:Aurora 切换会断连且无法直接 fail back,双环境并行成本较高;PlanetScale 则强调在线迁移、Schema revert 和更强的隔离性,但依赖 safe migrations 与 Vitess 能力。整体结论是,两者虽然表面相似,但目标不同,Aurora 更偏维护窗口控制,PlanetScale 更偏持续在线变更。需要注意的是,这是一篇厂商视角的对比文,缺少独立 benchmark 和第三方验证。

文中直接给出 binlog replication、ghost table、rolling upgrades、Schema revert 等机制差异,信息足以支撑数据库变更方案选型。适合做平台工程、数据库运维和迁移设计的参考,但需意识到它带有明显厂商立场,结论应结合独立验证。

工程实践PlanetScale Blog

Considerations for building a database disaster recovery plan

文章围绕数据库灾难恢复(DR)方案的构建展开,先区分了高可用(HA)与灾难恢复的目标:前者强调通过复制和自动故障切换尽量不中断服务,后者强调在重大故障后尽快恢复业务。作者进一步解释了 RPO 与 RTO 的含义,并指出两者越小,恢复方案的复杂度和成本越高,因此必须结合业务可承受的数据损失和停机时间来设定。文章特别强调数据库是有状态系统,不能像无状态应用那样简单替换实例,因此备份、复制和恢复流程都需要按数据一致性来设计。随后对 MySQL 复制、异步/半同步模式、逻辑/物理备份、全量/增量备份及其性能影响做了说明,指出跨区域复制和在副本上执行备份更适合降低恢复时间和主库负载。最后给出一套可落地的 DR 规划建议,包括分级恢复优先级、用收入损失衡量停机成本、自动化恢复、定期演练以及验证备份可恢复性,适合构建面向生产环境的数据库韧性方案。

文章直接给出了数据库灾备规划的关键证据:RPO/RTO 设定、复制与备份策略、跨地域恢复、自动化和演练验证,内容不是泛泛而谈。适合负责 MySQL、云上基础设施或生产稳定性的工程师参考,尤其可迁移到任何有状态系统的容灾设计中。

科研议题Andy Pavlo Database Blog

Databases in 2023: A Year in Review

Andy Pavlo 对 2023 年数据库领域的年度回顾,从技术、产品与产业三条线梳理全年关键事件。文章解释向量数据库因 LLM 爆发而走红的技术原理(embedding 与近似最近邻检索),并对比 JSON 类型的普及历史,指出其工程门槛较低、护城河可能不足。随后分析 SQL:2023 新增的 SQL/PGQ 属性图查询与 SQL/MDA 多维数组,讨论图查询对最坏情况最优连接和因子化等优化技术的依赖。作者还复盘 MariaDB 公司 IPO 后的财务危机、FAA NOTAM 遗留系统数据库文件损坏导致全美航班停飞,以及数据库领域融资与并购。文章观点鲜明但带有个人调侃色彩,具体厂商数据和判断需结合原文与后续事实核验。

推荐收录:作者是数据库领域知名学者,文章不仅回顾年度事件,还给出向量数据库、SQL:2023 新特性及查询优化挑战的技术判断,并辅以 MariaDB、FAA NOTAM 等真实教训。适合数据库工程师、研究者和架构师把握技术脉络与选型风险,但需注意其观点性和年度快照属性。

技术文章Andy Pavlo Database Blog

Yes, PostgreSQL Has Problems. But We’re Sticking With It!

文章围绕 PostgreSQL 的 MVCC 实现,系统讨论版本复制、表膨胀、二级索引维护和 vacuum 管理四类问题及优化手段。作者指出,更新复制整行、死元组与活元组同页存储、索引写放大以及 autovacuum 配置复杂,会带来存储浪费、I/O 升高和查询变慢,其中版本复制不重写内核难以根治。优化上建议用 pgstattuple 或估算脚本监控膨胀,用 pg_repack 在线回收空间,通过 pg_stat_all_indexes 清理重复和未使用索引;vacuum 方面则需表级调小 autovacuum_vacuum_scale_factor、监控长事务与进度,并调优 work_mem、cost_limit、cost_delay。文章结论是 PostgreSQL 虽有问题仍值得坚持,但优化高度依赖人工判断,pg_repack 和杀事务等操作需在低峰并评估业务风险。

推荐收录,因为文章由数据库研究者撰写,针对 PostgreSQL MVCC 的版本复制、膨胀、索引维护和 vacuum 四个具体问题,给出了 pgstattuple、pg_repack、pg_stat_* 视图与 autovacuum 参数的诊断/调优路径,技术证据明确。适合 DBA、后端工程师和数据库系统研究者用于生产运维、容量规划和 MVCC 权衡;但部分操作需低峰执行并评估杀事务风险,且文中含 OtterTune 产品推广。

技术文章Andy Pavlo Database Blog

The Part of PostgreSQL We Hate the Most

文章由 Andy Pavlo 与 Bohan Zhang 合作,系统批评 PostgreSQL 的 MVCC 实现。核心指出 PostgreSQL 采用 append-only 版本存储、O2N 版本链和每版本索引项,导致版本复制、表膨胀、二级索引写放大和 autovacuum 管理困难四大问题。作者对比 MySQL、Oracle 使用 delta 存储与逻辑指针的做法,说明 PostgreSQL 设计是 1980 年代遗留方案,不推荐新 DBMS 效仿。文中引用 CMU 研究与 OtterTune 客户监控数据,包括 Uber 从 Postgres 迁移 MySQL 的案例,但结论更偏向写密集负载,并非完整中立的 benchmark。

推荐收录:文章以存储布局、版本链、索引维护和 autovacuum 行为等具体机制,直接说明 PostgreSQL append-only MVCC 的性能代价,并给出与 MySQL/Oracle 的对照证据。适合数据库内核、DBA、后端架构师和云数据库选型者阅读,可迁移到 MVCC 设计、写放大评估、索引优化和 vacuum 调优场景;需注意其结论偏向写密集工作负载。

技术文章Andy Pavlo Database Blog

Databases in 2022: A Year in Review

本文是 Andy Pavlo 对 2022 年数据库领域的年度回顾,按融资、区块链数据库、新系统、人物纪念等主题梳理行业动态。作者指出数据库创业融资在下半年明显转冷,并以架构分析讨论 Google AlloyDB、Snowflake Unistore、MySQL Heatwave、Meta Velox、InfluxDB IOx 等新系统;他认为 Velox、DataFusion 等可扩展执行引擎会推动 OLAP 查询执行组件商品化,未来差异化将转向 UI/UX 与查询优化。文章还强烈批评区块链数据库在加密货币之外缺乏实际用例,并纪念 Martin Kersten 对 MonetDB、列存与向量化执行的贡献。内容带主观立场和大量个人评论,不是严格技术论文或实验报告,但可作为观察 2022 年数据库生态的参考。

推荐收录,因为文章由数据库领域知名研究者撰写,直接记录了 2022 年数据库融资、产品发布与系统架构变化,并对 AlloyDB、Velox 等给出可讨论的架构判断。适合数据库研究者、系统架构师和基础设施从业者了解行业趋势与技术脉络。需注意其观点主观、夹杂段子和政治玩笑,且缺少实验数据,不能替代深度技术论文。

技术文章Andy Pavlo Database Blog

Ten Database Crack Commandments

文章借用 Notorious B.I.G. 的《Ten Crack Commandments》,提出十条数据库运维与管理戒律。内容涵盖:不向厂商暴露预算、最小权限、监控数据不存回同一 DBMS、应用与 DBMS 分离、避免无休止调参、限制单实例多租户、及时执行维护任务、不要为未到来流量过度配置等。作者结合 Postgres/MySQL 的行级安全、MVCC、自动 vacuum,以及 AWS RDS 的预留实例和维护窗口等具体机制说明取舍。文章带有 OtterTune 产品推广色彩,部分云产品价格与功能具有 2022 年时效性,但多数原则对数据库性能、可靠性和成本治理仍有长期参考价值。

推荐收录。文章虽以歌曲类比并含 OtterTune 推广,但十条规则均给出可验证的数据库运维依据,如行级安全、MVCC、自动 vacuum、多租户资源竞争和云实例过度配置的代价。适合 DBA、后端/SRE 与使用云数据库的工程团队作为检查清单,其中最小权限、监控分离、预留实例和维护窗口等经验可迁移到生产系统;需注意云产品细节和厂商立场带来的时效与偏向。

工程实践Andy Pavlo Database Blog

You Are Overpaying Jeff Bezos For Your Databases (And The Things He Does With That Extra Money)

文章由 Andy Pavlo 撰写、原载 OtterTune,讨论 AWS RDS 用户常见的三类数据库过度支出:盲目选择过大实例、沿用默认配置、以及过度购买 Provisioned IOPS。作者用 PostgreSQL RDS 和 TPC-C 基准做对比实验,显示垂直扩容超过 db.m5.8xlarge 后吞吐不再提升,优化配置后较小实例可达到大实例默认配置的吞吐且年成本减半,而写密集负载下 PIOPs 超过 10k 后收益递减。结论是先做数据库调优和容量规划,再决定规格与云资源,可避免为未使用能力付费。边界是实验基于特定 AWS RDS 版本、实例族和 2021 年定价,且文章带有 OtterTune 产品推广倾向。

推荐作为工程案例收录:文中用 TPC-C 对比默认配置与调优配置、实例规格和 PIOPs 曲线,给出“先调优再扩容”的可验证证据。适合 DBA、后端与云成本优化读者,用于评估 RDS 规格、配置和 I/O 预算。需注意作者推广 OtterTune,且 AWS 定价与实例型号已变化,应结合当前环境复测。

个人心得Andy Pavlo Database Blog

On Naming a Database Management System

文章由 Andy Pavlo 回顾为 DBMS 命名的困难,结合 H-Store、Peloton 及 CMU 自研数据库的亲身经历,分析数据库命名中常见的后缀模式、相似名称冲突和改名案例。作者统计 dbdb.io 中 700 多个数据库的命名,指出 DB、SQL、Base 等后缀高度同质,并讨论搜索引擎可见性、商标争议和开发者品牌认同。随后提出“Pavlo Database Naming Method”:由两个不相关单音节词组合成双音节、独特且易拼写的名字,以 Postgres 和 Clickhouse 为最佳范例,并以 BusTub 作为实践案例。该方法的适用边界是学术项目和早期项目,商业系统可能需要直白名称;作者也承认颜色词、已有含义词等例外,且结论带有个人偏好和幽默色彩。

推荐收录。文章虽以幽默随笔形式写成,但提供了数据库命名这一常被忽视的工程文化议题的系统观察:后缀统计、同名冲突、改名案例和可操作的命名方法,来自长期数据库研究者的亲身经验。对设计开源数据库、产品或学术系统命名的人有直接参考价值,也可迁移到其他开发者工具的品牌与可发现性决策;不过其命名方法偏学术和个人审美,商业采用需结合商标与市场约束。