聊聊嵌入式数据库

提到数据库,大多数人首先想到的都是 MySQL、PostgreSQL 或 Redis。但近年来,越来越多的桌面应用、浏览器扩展、边缘计算、IoT 设备,甚至一些后端服务,也开始选择使用嵌入式数据库。那么,什么是嵌入式数据库?它又有哪些优势?


什么是嵌入式数据库?

嵌入式数据库(Embedded Database)是一种直接集成到应用程序内部的数据库。

它不像 MySQL 或 PostgreSQL 那样需要单独安装数据库服务,而是作为一个库文件随程序一起运行。

也就是说:

  • 没有数据库服务器
  • 没有独立进程
  • 不需要监听端口
  • 不需要额外部署

应用程序可以直接读写数据库文件。

整个架构更加轻量。


与传统数据库有什么区别?

传统数据库通常采用客户端 / 服务端架构。

1
2
3
4
5
6
7
应用程序


MySQL Server


数据库文件

而嵌入式数据库则更加简单。

1
2
3
4
5
6
7
应用程序


嵌入式数据库


数据库文件

整个过程不需要网络通信,也没有额外的数据库服务。


常见的嵌入式数据库

目前比较流行的嵌入式数据库主要有下面几种。

数据库 特点 适用场景
SQLite 最经典、最成熟 手机 App、桌面软件
BoltDB Go 原生 KV 数据库 Go 项目、本地配置
bbolt BoltDB 的维护版本 Go 服务
BadgerDB 高性能 LSM 数据库 缓存、本地索引
Pebble CockroachDB 使用 高性能 KV
LevelDB Google 开源 浏览器、缓存
RocksDB Facebook 开源 大数据存储
LMDB 内存映射数据库 高性能读取

不同数据库各有特点。

例如 SQLite 更偏向关系型数据库。

而 BoltDB、BadgerDB 更适合作为 Key-Value 存储。


为什么越来越受欢迎?

1. 部署简单

这是最大的优势。

很多 Go 项目最终只需要一个可执行文件。

如果数据库也是嵌入式的,那么部署时甚至只需要:

1
2
app
data.db

无需安装:

  • MySQL
  • PostgreSQL
  • Redis

整个部署过程非常简单。


2. 性能并不差

很多人认为:

“没有数据库服务器,性能会不会很低?”

实际上并不是。

由于嵌入式数据库:

  • 没有网络通信
  • 没有 Socket
  • 没有 TCP
  • 没有 SQL 解析(部分数据库)

很多简单读写场景反而更快。

特别是:

  • 配置读取
  • 缓存
  • 日志
  • 本地索引

性能往往非常优秀。


3. 更容易发布

很多开源项目都会提供:

1
2
3
4
5
Windows

Linux

macOS

三个版本。

如果依赖 MySQL。

用户还需要:

安装数据库

初始化

创建用户

导入 SQL

配置连接

而嵌入式数据库只需要:

1
2
3
4
5
下载

启动

开始使用

用户体验会好很多。


4. 数据天然本地化

很多桌面软件都会把数据保存在:

1
2
3
4
5
config.db

history.db

cache.db

复制数据库文件即可完成:

  • 备份
  • 迁移
  • 恢复

不需要额外导出 SQL。


有没有缺点?

当然有。

不适合高并发写入

虽然很多嵌入式数据库支持并发。

但对于:

  • 电商
  • 社交平台
  • 大型论坛

这种高并发业务。

仍然推荐:

  • MySQL
  • PostgreSQL

因为它们拥有更加成熟的事务管理。


不适合多台服务器共享

嵌入式数据库本质上还是一个本地文件。

例如:

1
2
3
4
5
6
7
server-a

data.db

server-b

data.db

两台服务器不能同时写同一个数据库文件。

因此:

分布式

主从同步

读写分离

这些能力通常需要额外实现。


哪些项目适合使用?

下面这些场景,其实都很适合。

  • 浏览器扩展
  • 桌面应用
  • Electron 项目
  • CLI 工具
  • NAS 应用
  • IoT 设备
  • 单机服务
  • 本地缓存
  • 配置中心
  • 日志系统

很多人每天都在使用 SQLite。

例如:

  • 微信
  • Chrome
  • Firefox
  • VS Code(部分数据)
  • Android
  • iOS

它们内部都有 SQLite 的身影。


Go 为什么喜欢嵌入式数据库?

近年来越来越多 Go 项目开始采用:

  • bbolt
  • BadgerDB
  • Pebble

原因很简单:

Go 推崇:

一个二进制文件完成部署。

如果数据库也采用嵌入式。

整个项目最终可能只需要:

1
2
3
app
config.yaml
data.db

部署体验非常优秀。

这也是很多个人开发者和开源项目喜欢它的重要原因。

选择数据库,不是追求”最强”,而是找到最适合自己项目的方案。