百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

从 SQLite 到 DuckDB:查询快 5 倍,存储减少 80%

liuian 2025-08-06 21:04 40 浏览

作者丨 Trace
译者丨明知山
策划丨李冬梅

Trace 从一开始就使用 SQLite 将所有数据存储在用户设备上。这是一个非常不错的选择—— SQLite 高度可靠,并且多种编程语言都提供了广泛支持。毕竟,它是全球部署最广泛的数据库之一。

Trace 是一款 macOS 时间追踪应用,可以监控你在 Mac 上的时间使用情况。鉴于它的功能,Trace 需要处理大量的数据,因此是一款数据密集型应用。尽管 SQLite 表现不错,但我们仍然面临两个关键挑战:

  • 随着时间的推移,SQLite 数据库文件体积会显著增大。

  • 随着数据集的增长,聚合查询响应速度开始变慢。

我们尝试了许多优化 SQLite 的方法,最好发现了 DuckDB:一个类似于 SQLite 的可嵌入式数据库系统,专为分析工作负载进行了优化。经过一段时间的测试,证明 DuckDB 比 SQLite 更适合我们的时间追踪应用。

为什么选择 DuckDB

我们需要一个能够嵌入到应用中,同时又快速且可靠的数据库系统。SQLite 和 DuckDB 都可以满足这些要求,但我们发现 DuckDB 在执行分析查询时比 SQLite 快 3 到 5 倍,而且随着数据量的增加,这种优势更加明显。

我们最复杂的查询涉及多个大表和视图的连接,并且大量依赖聚合 SQL 函数。在这种工作负载下,DuckDB 在这方面超越了 SQLite 也就不足为奇了。

DuckDB 的文档写道:

DuckDB 是为支持分析查询工作负载(即在线分析处理,OLAP)而设计的。

为了高效地支持这种工作负载,缩短每个单独值所消耗的 CPU 时间至关重要。在数据管理领域,实现这一目标的最新技术是矢量化或即时查询执行引擎。DuckDB 使用了列存储矢量化查询执行引擎。虽然查询仍为解释执行,但会一次性处理大量值(一个“向量”)。这大大降低了传统系统(如 PostgreSQL、MySQL 或 SQLite)中逐行处理数据的开销。矢量化查询执行在 OLAP 查询中表现出更好的性能。

SQLite 逐行处理数据,而 DuckDB 使用列存储矢量化执行引擎,同时处理大量值。这种处理方式特别适合我们的分析工作负载。

ClickBench 基准测试显示,在某些分析查询中,DuckDB 的性能比 SQLite 快了多达 1200 倍。

尽管 DuckDB 在我们的工作流程中读取性能显著优于 SQLite,但在单行操作方面,它不如 SQLite。在我们的测试中,SQLite 在这些场景下比 DuckDB 快大约两倍。

尽管如此,另一个促使我们选择 DuckDB 的关键因素是它的自动磁盘压缩功能,这个功能大大减少了存储空间。

我们创建了一个张表,与我们应用中使用的表类似,包含了两个时间戳列、一个主键整数 ID 和一个布尔列。插入 100 万行数据后,SQLite 数据库文件大小为 101.6MB,而 DuckDB 仅需 23.1MB,体积减少了 77%。

迁移过程

迁移过程并非一帆风顺。SQLite 的编程语言生态系统支持比 DuckDB 要好得多。Trace 的大部分代码是用 Rust 编写的,我们使用 Diesel ORM 来处理数据库交互。

DuckDB 也有自己的 Rust 包,即 duckdb-rs,但它并不是 ORM。因此,我们不得不重写代码库的核心部分,并自己实现了一个数据库迁移系统。

在重写过程中,我们还遇到了 DuckDB 的一些并发限制。以前使用 SQLite 时,我们可以打开多个并发连接,对同一张数据库表执行操作。而使用 DuckDB 时,这种情况会导致大量数据丢失——一个连接的数据会被保存,另一个连接的数据则完全丢失。解决这个问题并不难,我们只需要确保在任何给定时间只有一个线程可以修改一张表。

另外需要注意的是,将 DuckDB 包含在我们的应用中几乎使应用包的体积翻倍,从 26MB 增加到 44MB。虽然体积变大了,但对我们来说绝对值得。

我们是否完全放弃了 SQLite

没有。尽管 DuckDB 在分析工作负载方面表现出色,但我们仍然依赖 SQLite 来执行一些核心操作。SQLite 更适合处理频繁的小事务,因为它轻量,对简单查询速度更快,并且更有效地支持并发连接。

总 结

自从迁移到 DuckDB 以来:

  • 读取查询至少快了 3 到 5 倍(这也让我们的仪表盘更快了)

  • 数据库文件占用的存储空间减少了约 80%

  • 应用包体积几乎翻倍(从 26MB 增加到 44MB)

总体而言,我们对这次迁移非常满意,并且期待继续使用 DuckDB。

原文链接:

https://trytrace.app/blog/migrating-from-sqlite-to-duckdb/

声明:本文由 InfoQ 翻译,未经许可禁止转载。

今日好文推荐
74 岁 C++ 之父最新蓝图:让代码更安全,还能兼容40年前的老程序!
谷歌史上最大收购:320 亿美元买下了发现 DeepSeek 数据库泄露的那家小企业
当大模型接管编程:NASA 疯狂的“反人类”编程要求,为何仍被奉为行业圣典?
英伟达软硬件“双拳出击”:Blackwell Ultra、Rubin 芯片炸场,开源Dynamo让R1 token生成暴涨40倍

相关推荐

教你把多个视频合并成一个视频的方法

一.情况介绍当你有一个m3u8文件和一个目录,目录中有连续的视频片段,这些片段可以连成一段完整的视频。m3u8文件打开后像这样:m3u8文件,可以理解为播放列表,里面是播放视频片段的顺序。视频片段像这...

零代码编程:用kimichat合并一个文件夹下的多个文件

一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢?在kimichat对话框中输入提示词:你是一个Python编程专家,完成如下的编程任务:这个文件夹:D:\downloa...

Java APT_java APT 生成代码

JavaAPT(AnnotationProcessingTool)是一种在Java编译阶段处理注解的工具。APT会在编译阶段扫描源代码中的注解,并根据这些注解生成代码、资源文件或其他输出,...

Unit Runtime:一键运行 AI 生成的代码,或许将成为你的复制 + 粘贴神器

在我们构建了UnitMesh架构之后,以及对应的demo之后,便着手于实现UnitMesh架构。于是,我们就继续开始UnitRuntime,以用于直接运行AI生成的代码。PS:...

挣脱臃肿的枷锁:为什么说Vert.x是Java开发者手中的一柄利剑?

如果你是一名Java开发者,那么你的职业生涯几乎无法避开Spring。它如同一位德高望重的老国王,统治着企业级应用开发的大片疆土。SpringBoot的约定大于配置、SpringCloud的微服务...

五年后,谷歌还在全力以赴发展 Kotlin

作者|FredericLardinois译者|Sambodhi策划|Tina自2017年谷歌I/O全球开发者大会上,谷歌首次宣布将Kotlin(JetBrains开发的Ja...

kotlin和java开发哪个好,优缺点对比

Kotlin和Java都是常见的编程语言,它们有各自的优缺点。Kotlin的优点:简洁:Kotlin程序相对于Java程序更简洁,可以减少代码量。安全:Kotlin在类型系统和空值安全...

移动端架构模式全景解析:从MVC到MVVM,如何选择最佳设计方案?

掌握不同架构模式的精髓,是构建可维护、可测试且高效移动应用的关键。在移动应用开发中,选择合适的软件架构模式对项目的可维护性、可测试性和团队协作效率至关重要。随着应用复杂度的增加,一个良好的架构能够帮助...

颜值非常高的XShell替代工具Termora,不一样的使用体验!

Termora是一款面向开发者和运维人员的跨平台SSH终端与文件管理工具,支持Windows、macOS及Linux系统,通过一体化界面简化远程服务器管理流程。其核心定位是解决多平台环境下远程连接、文...

预处理的底层原理和预处理编译运行异常的解决方案

若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好![Mac-10.7.1LionIntel-based]Q:预处理到底干了什么事情?A:预处理,顾名思义,预先做的处理。源代码中...

为“架构”再建个模:如何用代码描述软件架构?

在架构治理平台ArchGuard中,为了实现对架构的治理,我们需要代码+模型描述所要处理的内容和数据。所以,在ArchGuard中,我们有了代码的模型、依赖的模型、变更的模型等,剩下的两个...

深度解析:Google Gemma 3n —— 移动优先的轻量多模态大模型

2025年6月,Google正式发布了Gemma3n,这是一款能够在2GB内存环境下运行的轻量级多模态大模型。它延续了Gemma家族的开源基因,同时在架构设计上大幅优化,目标是让...

比分网开发技术栈与功能详解_比分网有哪些

一、核心功能模块一个基本的比分网通常包含以下模块:首页/总览实时比分看板:滚动展示所有正在进行的比赛,包含比分、比赛时间、红黄牌等关键信息。热门赛事/焦点战:突出显示重要的、关注度高的比赛。赛事导航...

设计模式之-生成器_一键生成设计

一、【概念定义】——“分步构建复杂对象,隐藏创建细节”生成器模式(BuilderPattern):一种“分步构建型”创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...

构建第一个 Kotlin Android 应用_kotlin简介

第一步:安装AndroidStudio(推荐IDE)AndroidStudio是官方推荐的Android开发集成开发环境(IDE),内置对Kotlin的完整支持。1.下载And...