10万+实例的抉择:为什么我们正在用SQLite替换PostgreSQL?

刘华阳 2025-12-04 10:10:23
SQLite打败了PostgreSQL?是的,的确,在我目前的这个工作环境中完败。公司PostgreSQL的实例不多,10万多个。对,你没有听错,10万多。线下终端全部是PostgreSQL,不过马上就要改朝换代了,SQLlite是新的研究对象了。好了,单位的机密就不能继续说了,还是说技术吧。

 

SQLite 和PostgreSQL比功能,计算能力,应用场景,SQLite就是一个菜鸡,但是要比数量,使用的人数,适应的场景,PostgreSQL完败。我们会来找一期说说 postgreSQL在终端市场上的一些问题。

 

SQLite起初也是一个企业因为没有合适的线下终端数据库,而自己研发的一款数据库,目的就是嵌入式。它的起源是2004年,3.0到2025年已经发展到了3.51版本,而这些版本之间的不同和操作系统是有关系的。

 

为什么要搞清楚版本的问题,主要是每个sqllite的版本和操作系统之间的关系非常紧密,不同的SQLite提供的功能和能力与本身和操作系统密切相关。

 

https://www.sqlite.org/src/taglist

 

软件版本发布与操作系统版本推测表

 

Tag Name

Most Recent Release Date (YYYY-MM-DD)

macOS Version (Approx.)

Windows Version (Approx.)

Linux Kernel (Approx.)

Ubuntu LTS (Approx.)

Rocky Linux (Approx.)

Android Version (Approx.)

major-release

2025-11-04

16 (TBD)

11/12

6.x

24.04/25.10

10/11

15/16

version-3.51.0

2025-11-04

16 (TBD)

11/12

6.x

24.04/25.10

10/11

15/16

version-3.42.1

2025-08-06

15 (TBD)

11/12

6.x

24.04/25.10

10

15

version-3.44.5

2025-07-24

15 (TBD)

11/12

6.x

24.04/25.10

10

15

version-3.50.4

2025-07-30

15 (TBD)

11/12

6.x

24.04/25.10

10

15

version-3.50.3

2025-07-17

15 (TBD)

11/12

6.x

24.04/25.10

10

15

version-3.50.2

2025-06-28

15 (TBD)

11/12

6.x

24.04/25.10

10

15

version-3.50.1

2025-06-06

15 (TBD)

11/12

6.x

24.04/25.10

10

15

version-3.50.0

2025-05-29

15 (TBD)

11/12

6.x

24.04/25.10

10

15

version-3.49.2

2025-05-07

14 (Sonoma)

11/12

6.x

24.04 (LTS)

9/10

15

patch-release

2025-02-19

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.49.1

2025-02-18

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.49.0

2025-02-06

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.48.0

2025-01-14

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.47.2

2024-12-07

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.47.1

2024-11-25

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.47.0

2024-10-21

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.46.1

2024-08-13

13 (Ventura)

11

6.x

22.04 (LTS)

9/10

14

version-3.46.0

2024-05-23

13 (Ventura)

11

6.x

24.04 (LTS)

9/10

14

version-3.45.3

2024-04-15

13 (Ventura)

11

6.x

22.04 (LTS)

9/10

14

version-3.44.3

2024-04-05

13 (Ventura)

11

6.x

22.04 (LTS)

9/10

14

version-3.45.2

2024-03-12

13 (Ventura)

11

6.x

22.04 (LTS)

9/10

14

version-3.45.1

2024-01-30

13 (Ventura)

11

6.x

22.04 (LTS)

9/10

14

version-3.45.0

2024-01-15

13 (Ventura)

11

6.x

22.04 (LTS)

9/10

14

version-3.44.2

2023-11-24

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.44.1

2023-11-22

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.44.0

2023-11-01

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.43.2

2023-10-10

14 (Sonoma)

11

6.x

22.04 (LTS)

9/10

14

version-3.43.1

2023-09-11

13 (Ventura)

11

6.x

22.04 (LTS)

9/10

13

version-3.43.0

2023-08-24

13 (Ventura)

11

6.x

22.04 (LTS)

9/10

13

version-3.42.0

2023-05-16

13 (Ventura)

10/11

6.x

22.04 (LTS)

9/10

13

version-3.41.2

2023-03-22

13 (Ventura)

10/11

6.x

22.04 (LTS)

9

13

version-3.41.1

2023-03-10

13 (Ventura)

10/11

6.x

22.04 (LTS)

9

13

version-3.41.0

2023-02-21

13 (Ventura)

10/11

6.x

22.04 (LTS)

9

13

version-3.40.1

2022-12-28

13 (Ventura)

10/11

5.x/6.x

22.04 (LTS)

9

13

version-3.40.0

2022-11-16

13 (Ventura)

10/11

5.x/6.x

22.04 (LTS)

9

13

version-3.39.4

2022-09-29

12 (Monterey)

10/11

5.x

22.04 (LTS)

9

12

version-3.39.3

2022-09-05

12 (Monterey)

10/11

5.x

22.04 (LTS)

9

12

version-3.39.2

2022-07-21

12 (Monterey)

10/11

5.x

22.04 (LTS)

9

12

version-3.39.1

2022-07-13

12 (Monterey)

10/11

5.x

22.04 (LTS)

9

12

version-3.39.0

2022-06-25

12 (Monterey)

10/11

5.x

22.04 (LTS)

9

12

version-3.38.5

2022-05-06

12 (Monterey)

10/11

5.x

22.04 (LTS)

9

12

version-3.38.4

2022-05-04

12 (Monterey)

10/11

5.x

22.04 (LTS)

9

12

version-3.38.3

2022-04-27

12 (Monterey)

10/11

5.x

22.04 (LTS)

9

12

version-3.38.2

2022-03-26

12 (Monterey)

10/11

5.x

20.04 (LTS)

8/9

12

version-3.38.1

2022-03-12

12 (Monterey)

10/11

5.x

20.04 (LTS)

8/9

12

version-3.38.0

2022-02-22

12 (Monterey)

10/11

5.x

20.04 (LTS)

8/9

12

version-3.37.2

2022-01-06

12 (Monterey)

10/11

5.x

20.04 (LTS)

8/9

12

version-3.37.1

2021-12-30

12 (Monterey)

10/11

5.x

20.04 (LTS)

8/9

12

version-3.37.0

2021-11-27

12 (Monterey)

10/11

5.x

20.04 (LTS)

8/9

12

version-3.36.0

2021-06-18

11 (Big Sur)

10

5.x

20.04 (LTS)

8/9

11

version-3.35.5

2021-04-19

11 (Big Sur)

10

5.x

20.04 (LTS)

8

11

version-3.35.0

2021-03-12

11 (Big Sur)

10

5.x

20.04 (LTS)

8

11

version-3.34.1

2021-01-20

11 (Big Sur)

10

5.x

20.04 (LTS)

8

11

version-3.34.0

2020-12-01

11 (Big Sur)

10

5.x

20.04 (LTS)

8

11

version-3.33.0

2020-08-14

10.15 (Catalina)

10

5.x

20.04 (LTS)

8

10

version-3.32.0

2020-05-22

10.15 (Catalina)

10

5.x

20.04 (LTS)

8

10

version-3.31.0

2020-01-22

10.15 (Catalina)

10

5.x

18.04 (LTS)

8

10

version-3.30.0

2019-10-04

10.14 (Mojave)

10

5.x

18.04 (LTS)

8

10

version-3.29.0

2019-07-10

10.14 (Mojave)

10

4.x/5.x

18.04 (LTS)

8

9 (Pie)

version-3.28.0

2019-04-16

10.14 (Mojave)

10

4.x/5.x

18.04 (LTS)

8

9 (Pie)

version-3.27.0

2019-02-07

10.14 (Mojave)

10

4.x

18.04 (LTS)

7/8

9 (Pie)

version-3.26.0

2018-12-01

10.14 (Mojave)

10

4.x

18.04 (LTS)

7/8

9 (Pie)

version-3.25.0

2018-09-15

10.13 (High Sierra)

10

4.x

18.04 (LTS)

7/8

8 (Oreo)

version-3.24.0

2018-06-04

10.13 (High Sierra)

10

4.x

18.04 (LTS)

7

8 (Oreo)

version-3.23.0

2018-04-02

10.13 (High Sierra)

10

4.x

16.04 (LTS)

7

8 (Oreo)

version-3.22.0

2018-01-22

10.13 (High Sierra)

10

4.x

16.04 (LTS)

7

8 (Oreo)

version-3.21.0

2017-10-24

10.13 (High Sierra)

10

4.x

16.04 (LTS)

7

7 (Nougat)

version-3.20.0

2017-08-01

10.12 (Sierra)

10

4.x

16.04 (LTS)

7

7 (Nougat)

version-3.19.0

2017-05-22

10.12 (Sierra)

10

4.x

16.04 (LTS)

7

7 (Nougat)

version-3.18.0

2017-03-28

10.12 (Sierra)

10

4.x

16.04 (LTS)

7

7 (Nougat)

version-3.17.0

2017-02-13

10.12 (Sierra)

10

4.x

16.04 (LTS)

7

7 (Nougat)

version-3.16.0

2017-01-02

 

 

 

 

 

 

 

这个部分我看完也有点懵,怎么版本号低的在后面,版本号高的在前面?是的,官方文档就是这样。

 

 

SQLite 版本

主要发布时间

操作系统支持特性

说明

3.0 (2004)

POSIX, Windows NT/2000

初代 B-tree 引擎

启动现代 SQLite 时代

3.6.x (2008)

Linux 2.4+, Windows XP

引入 WAL 模式

依赖可靠的文件锁机制

3.7.x (2010)

Linux, macOS, Windows 7

WAL 默认稳定

支持 mmap()

3.8.x (2013)

Linux 3.x+, macOS 10.9+, Android 4+

Query planner 改进

引入 partial index、covering index

3.9~3.15 (2015–2016)

主流 Linux, macOS, Windows 10

支持 JSON1 扩展

UTF-8 全面兼容

3.24+ (2018)

Linux 4+, Android 8+, macOS 10.13+

支持 UPSERT

更好的并发性能

3.33+ (2020)

Linux 5+, Windows 10+, iOS 14+

支持大于 2GB 的数据库文件

改进文件系统同步

3.39+ (2022)

Linux, macOS, Android 12+

支持 STRICT 表模式

更适合现代移动端

3.45+ (2024)

Linux 6+, macOS Sonoma, Android 14

JSON5, decimal precision 改进

最新稳定版系列

 

 

macOS 版本

内置 SQLite 版本

10.15 (Catalina)

3.28

11 (Big Sur)

3.32

12 (Monterey)

3.35

13 (Ventura)

3.38

14 (Sonoma)

3.45

 

 

Android 版本

API Level

内置 SQLite 版本

7 (Nougat)

24

3.14

8 (Oreo)

26

3.18

9 (Pie)

28

3.22

10 (Q)

29

3.28

11 (R)

30

3.32

12 (S)

31

3.35

13 (T)

33

3.38

14 (U, 2024)

34

3.45

 

iOS 版本

SQLite 版本

iOS 13

3.28

iOS 14

3.32

iOS 15

3.35

iOS 16

3.39

iOS 17

3.45

 

研究了这么一番,我目前得出的结论是,3.45这个版本会比较适合,原因也很简单。这个版本可以兼容大部分现在流行的操作系统,同时也不会特别地落后。特别新的操作系统就算了,行业的原因,这里不解释。

 

下一步就是安装,现在这里找到的就是LINUX下的编译安装。在编译安装时遇到一个问题,就是tcl测试环境的问题,这里的查询可以不将这个进行编译。

 

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
echo '
#ifndef
 USE_SYSTEM_SQLITE' >tclsqlite3.c
cat sqlite3.c >>tclsqlite3.c
echo '
#endif
 /* USE_SYSTEM_SQLITE */' >>tclsqlite3.c
cat /data/sqllite345/src/tclsqlite.c >>tclsqlite3.c
tclsh8.6 /data/sqllite345/tool/buildtclext.tcl --destdir "" --cc "gcc" -g -O2 -DSQLITE_OS_UNIX=1 -DSQLITE_ENABLE_MATH_FUNCTIONS  
can't read "@": no such variable
    while executing
"subst $cmd"
    invoked from within
"if {$tcl_platform(platform)=="windows"} {
  # We are only able to install, uninstall, and list on Windows.
  # The build process is handled by the Mak..."
    (file "/data/sqllite345/tool/buildtclext.tcl" line 69)
make: *** [Makefile:1603: tclextension-install] Error 1

 

编译时./configure --disable-tcl 去掉tcl测试环境,再进行make make install就可以了,版本3.45 Rocky linux 8.10。

 

安装完毕,我就开启了自学模式,也感谢群里的同学,我问有没有sqllite的群,然后就给我拉到QQ群了。这个同学叫“小明”。

 

Sqlite 架构

 

Sqllite 由两个部分组成,一个是主体,另一个是测试单元。在编辑的时候我们抛弃的就是测试的单元,测试单元与数据库没有必然的联系,从图中也可以看出。

 

下面开始快速地对一些我们感兴趣的问题进行快速的梳理,今天只是一部分,下期我们继续。

 

1 并发的问题,在PG上并发那不是问题,对于sqlite来说,那就是一个大问题。sqlite有两种模式,rollback-journal 和 wal模式,这个是通过命令PRAGMA journal_mode = WAL; 来控制的。

 

那么这两个模式有什么区别,一句话:

 

rollback-journal 模式会产生读和写的库锁,你没有看错,库锁。 wal 模式会产生多读 并发和多写的库锁。

 

2 在测试中很容易就会出现数据库的锁

 

测试的方法也很简单,两个SQL,然后批量进行运行。

 

测试分为 reader.sql  writer.sql 读写的操作,然后还有一个sh 脚本来调用。

 

#!/bin/bash


for i in {1..50}; do
whiletrue; do
    sqlite3 /data/data/test.db < /data/data/writer.sql
done &
done


# 50 并发查询
for i in {1..50}; do
whiletrue; do
    sqlite3 /data/data/test.db < /data/data/reader.sql
done &
done

 

SELECT count(*)
FROM test_data
WHERE value > (abs(random() % 50000));

 

BEGIN TRANSACTION;
INSERT INTO test_data (name, value)
VALUES ('writer_' || random(), abs(random() % 100000));
COMMIT;

 

在测试中一开始就产生了大量的database locks:

 

数据库锁

 

所以我们会出一期,如何使用sqlite开发,还有一期sqllite如何进行运维和使用的文章,敬请期待吧。sqllite 是世界装机量最大的数据库,这会在我们这边也要被印证了。我们会有一期再分析一下,为什么SQLite 打败了PostgreSQL?
 

作者介绍

刘华阳,20年经历风霜雨打的 DBA,5年的 DBA 架构和团队管理经验,只要是数据库都喜欢学习。PostgreSQL ACE,MongoDB 狂热者,10年的 MYSQL 工作经验,现在在玩 POLARDB 与时俱进。

 

来源丨公众号:AustinDatabases(ID:AustinDatabases)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告