1. 首页 > sqlite教程 > 正文

sqlite教程FG017-编译选项、裁剪与定制构建

本文档风哥主要介绍sqlite数据库编译选项、裁剪与定制构建相关知识,风哥教程参考sqlite官方文档Compile Options等内容编写,适合DBA人员和开发人员在学习和测试中使用。

Part01-基础概念与理论知识

1.1 sqlite数据库编译选项概述

sqlite提供了丰富的编译选项,可以根据需求定制功能。更多视频教程www.fgedu.net.cn

sqlite数据库编译选项概述:

编译选项特点:
├── 功能开关:启用/禁用特性
├── 参数配置:设置默认值
├── 裁剪优化:减小库大小
├── 性能调优:优化性能
└── 平台适配:跨平台支持

编译选项类型:
├── 启用选项:SQLITE_ENABLE_*
├── 禁用选项:SQLITE_OMIT_*
├── 配置选项:SQLITE_DEFAULT_*
├── 限制选项:SQLITE_MAX_*
└── 调试选项:SQLITE_DEBUG

查看编译选项:
sqlite> SELECT * FROM pragma_compile_options ORDER BY 1;
COMPILER=gcc-9.3.0
DEFAULT_CACHE_SIZE=-2000
DEFAULT_FOREIGN_KEYS
DEFAULT_JOURNAL_SIZE_LIMIT=1048576
DEFAULT_SYNCHRONOUS=2
DEFAULT_WAL_SYNCHRONOUS=1
ENABLE_COLUMN_METADATA
ENABLE_FTS5
ENABLE_JSON1
ENABLE_RTREE
THREADSAFE=1

编译方式:
├── 源码编译:./configure && make
├── 直接编译:gcc -c sqlite3.c
├── Amalgamation:合并源码
└── 预编译:系统包管理器

1.2 sqlite数据库编译选项分类

编译选项按功能分为多个类别,学习交流加群风哥微信: itpux-com

sqlite数据库编译选项分类:

1. 功能启用选项(SQLITE_ENABLE_*)
├── ENABLE_FTS3/4/5:全文检索
├── ENABLE_JSON1:JSON支持
├── ENABLE_RTREE:R树索引
├── ENABLE_GEOPOLY:多边形支持
├── ENABLE_SESSION:会话扩展
├── ENABLE_COLUMN_METADATA:列元数据
├── ENABLE_STAT4:统计信息
└── ENABLE_UNLOCK_NOTIFY:解锁通知

2. 功能禁用选项(SQLITE_OMIT_*)
├── OMIT_AUTOINIT:自动初始化
├── OMIT_AUTOMATIC_INDEX:自动索引
├── OMIT_DEPRECATED:废弃API
├── OMIT_PROGRESS_CALLBACK:进度回调
├── OMIT_SHARED_CACHE:共享缓存
├── OMIT_TCL_VARIABLE:TCL变量
└── OMIT_UTF16:UTF-16支持

3. 默认配置选项(SQLITE_DEFAULT_*)
├── DEFAULT_CACHE_SIZE:默认缓存大小
├── DEFAULT_JOURNAL_SIZE_LIMIT:日志大小限制
├── DEFAULT_MEMSTATUS:内存状态
├── DEFAULT_SYNCHRONOUS:同步模式
├── DEFAULT_WAL_AUTOCHECKPOINT:WAL检查点
└── DEFAULT_FOREIGN_KEYS:外键约束

4. 限制选项(SQLITE_MAX_*)
├── MAX_LENGTH:最大字段长度
├── MAX_SQL_LENGTH:最大SQL长度
├── MAX_COLUMN:最大列数
├── MAX_EXPR_DEPTH:最大表达式深度
├── MAX_COMPOUND_SELECT:最大复合查询
└── MAX_VARIABLE_NUMBER:最大变量数

5. 线程安全选项(SQLITE_THREADSAFE)
├── 0:禁用线程安全
├── 1:完全线程安全(默认)
└── 2:连接级线程安全

1.3 sqlite数据库编译选项影响

不同编译选项对性能和大小有显著影响,更多学习教程公众号风哥教程itpux_com

sqlite数据库编译选项影响:

库大小影响:
┌─────────────────────────┬──────────────┐
│ 配置 │ 大小(约) │
├─────────────────────────┼──────────────┤
│ 完整功能 │ 1.2 MB │
│ 禁用FTS/RTREE │ 800 KB │
│ 最小配置 │ 400 KB │
│ 嵌入式裁剪 │ 200 KB │
└─────────────────────────┴──────────────┘

性能影响:
├── SQLITE_THREADSAFE=0:性能提升10-15%
├── SQLITE_OMIT_AUTOINIT:减少初始化开销
├── SQLITE_ENABLE_STAT4:查询优化提升
└── SQLITE_DEFAULT_CACHE_SIZE:缓存命中提升

内存影响:
├── SQLITE_DEFAULT_CACHE_SIZE:缓存内存
├── SQLITE_MAX_LENGTH:最大内存分配
├── SQLITE_ENABLE_MEMSYS5/6:内存管理器
└── SQLITE_DEFAULT_PCACHE_INITSZ:页缓存

兼容性影响:
├── SQLITE_OMIT_UTF16:不支持UTF-16
├── SQLITE_OMIT_DEPRECATED:移除旧API
├── SQLITE_OMIT_SHARED_CACHE:不支持共享缓存
└── SQLITE_OMIT_AUTOVACUUM:不支持自动VACUUM

Part02-生产环境规划与建议

2.1 sqlite数据库编译规划

合理的编译规划可以平衡功能和性能。风哥提示:生产环境建议使用稳定配置。

sqlite数据库编译规划:

1. 服务器端编译
├── 启用所有功能
├── 线程安全模式
├── 大缓存配置
└── 统计信息收集

2. 嵌入式编译
├── 裁剪不需要功能
├── 禁用线程安全
├── 小缓存配置
└── 最小化库大小

3. 移动端编译
├── 裁剪非必要功能
├── 优化内存使用
├── 启用压缩
└── 平台特定优化

4. 安全编译
├── 启用安全特性
├── 禁用危险功能
├── 启用加密扩展
└── 审计日志

推荐编译选项组合:
┌─────────────────┬──────────────────────────┐
│ 场景 │ 推荐选项 │
├─────────────────┼──────────────────────────┤
│ 服务器 │ 完整功能+线程安全 │
│ 嵌入式 │ 裁剪+最小化 │
│ 移动端 │ 裁剪+内存优化 │
│ 安全敏感 │ 安全特性+加密 │
└─────────────────┴──────────────────────────┘

Part03-生产环境项目实施方案

3.1 sqlite数据库基础编译实战

基础编译步骤:
# 下载源码
$ wget https://www.sqlite.org/2024/sqlite-autoconf-3450000.tar.gz
$ tar xzf sqlite-autoconf-3450000.tar.gz
$ cd sqlite-autoconf-3450000

# 标准编译
$ ./configure –prefix=/sqlite/app
$ make
$ make install

# 验证安装
$ /sqlite/app/bin/sqlite3 –version
3.45.0 2024-01-15 17:01:13

# 查看编译选项
$ /sqlite/app/bin/sqlite3 :memory: “SELECT * FROM pragma_compile_options;”
COMPILER=gcc-9.3.0
DEFAULT_CACHE_SIZE=-2000
DEFAULT_FOREIGN_KEYS
ENABLE_FTS5
ENABLE_JSON1
ENABLE_RTREE
THREADSAFE=1

# 编译后的文件
$ ls -la /sqlite/app/
drwxr-xr-x bin
drwxr-xr-x include
drwxr-xr-x lib

$ ls -la /sqlite/app/lib/
libsqlite3.a
libsqlite3.la
libsqlite3.so
libsqlite3.so.0
libsqlite3.so.0.8.6

3.2 sqlite数据库定制编译实战

定制编译示例:
# 使用Amalgamation编译
$ wget https://www.sqlite.org/2024/sqlite-amalgamation-3450000.zip
$ unzip sqlite-amalgamation-3450000.zip
$ cd sqlite-amalgamation-3450000

# 编译完整功能版本
$ gcc -c sqlite3.c \
-DSQLITE_ENABLE_FTS5 \
-DSQLITE_ENABLE_JSON1 \
-DSQLITE_ENABLE_RTREE \
-DSQLITE_ENABLE_GEOPOLY \
-DSQLITE_ENABLE_SESSION \
-DSQLITE_ENABLE_PREUPDATE_HOOK \
-DSQLITE_ENABLE_COLUMN_METADATA \
-DSQLITE_ENABLE_STAT4 \
-DSQLITE_THREADSAFE=1 \
-DSQLITE_DEFAULT_CACHE_SIZE=-64000 \
-DSQLITE_DEFAULT_FOREIGN_KEYS=1 \
-DSQLITE_DEFAULT_SYNCHRONOUS=2 \
-O2

$ ar rcs libsqlite3.a sqlite3.o
$ gcc -o sqlite3 shell.c sqlite3.c -lpthread -ldl

# 编译嵌入式裁剪版本
$ gcc -c sqlite3.c \
-DSQLITE_OMIT_LOAD_EXTENSION \
-DSQLITE_OMIT_DEPRECATED \
-DSQLITE_OMIT_PROGRESS_CALLBACK \
-DSQLITE_OMIT_SHARED_CACHE \
-DSQLITE_OMIT_TCL_VARIABLE \
-DSQLITE_OMIT_UTF16 \
-DSQLITE_THREADSAFE=0 \
-DSQLITE_DEFAULT_CACHE_SIZE=1000 \
-DSQLITE_DEFAULT_PAGE_SIZE=1024 \
-DSQLITE_MAX_LENGTH=1000000 \
-Os

$ ar rcs libsqlite3_embed.a sqlite3.o

# 比较库大小
$ ls -la libsqlite3*.a
-rw-r–r– libsqlite3.a 1.2M
-rw-r–r– libsqlite3_embed.a 450K

# 编译高性能版本
$ gcc -c sqlite3.c \
-DSQLITE_ENABLE_FTS5 \
-DSQLITE_ENABLE_JSON1 \
-DSQLITE_ENABLE_RTREE \
-DSQLITE_ENABLE_STAT4 \
-DSQLITE_THREADSAFE=0 \
-DSQLITE_DEFAULT_CACHE_SIZE=-128000 \
-DSQLITE_DEFAULT_WAL_AUTOCHECKPOINT=10000 \
-DSQLITE_DEFAULT_MMAP_SIZE=268435456 \
-O3 -march=native

$ ar rcs libsqlite3_perf.a sqlite3.o

3.3 sqlite数据库编译验证实战

编译验证:
# 验证编译选项
$ ./sqlite3 :memory: “SELECT * FROM pragma_compile_options ORDER BY 1;”
DEFAULT_CACHE_SIZE=-64000
DEFAULT_FOREIGN_KEYS
ENABLE_COLUMN_METADATA
ENABLE_FTS5
ENABLE_GEOPOLY
ENABLE_JSON1
ENABLE_PREUPDATE_HOOK
ENABLE_RTREE
ENABLE_SESSION
ENABLE_STAT4
THREADSAFE=1

# 功能测试
$ ./sqlite3 test.db
sqlite> CREATE VIRTUAL TABLE test_fts USING fts5(content);
sqlite> CREATE VIRTUAL TABLE test_rtree USING rtree(id, minX, maxX, minY, maxY);
sqlite> SELECT json_object(‘name’, ‘风哥’, ‘age’, 35);
{“name”:”风哥”,”age”:35}

# 性能测试
$ ./sqlite3 :memory: <

Part04-生产案例与实战讲解

4.1 sqlite数据库嵌入式裁剪案例

嵌入式裁剪编译脚本:
#!/bin/bash
# build_embedded.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

set -e

VERSION=”3450000″
PREFIX=”/sqlite/app/embedded”

echo “=== Building SQLite for Embedded ===”

# 下载源码
wget -q https://www.sqlite.org/2024/sqlite-amalgamation-${VERSION}.zip
unzip -q sqlite-amalgamation-${VERSION}.zip
cd sqlite-amalgamation-${VERSION}

# 编译选项
CFLAGS=”-Os -fPIC”
DEFINES=”
-DSQLITE_OMIT_LOAD_EXTENSION
-DSQLITE_OMIT_DEPRECATED
-DSQLITE_OMIT_PROGRESS_CALLBACK
-DSQLITE_OMIT_SHARED_CACHE
-DSQLITE_OMIT_TCL_VARIABLE
-DSQLITE_OMIT_UTF16
-DSQLITE_OMIT_AUTOINIT
-DSQLITE_OMIT_COMPLETE
-DSQLITE_OMIT_TCL_VARIABLE
-DSQLITE_THREADSAFE=0
-DSQLITE_DEFAULT_CACHE_SIZE=500
-DSQLITE_DEFAULT_PAGE_SIZE=1024
-DSQLITE_MAX_LENGTH=100000
-DSQLITE_MAX_SQL_LENGTH=10000
-DSQLITE_MAX_COLUMN=100
-DSQLITE_MAX_EXPR_DEPTH=100

# 编译
echo “Compiling…”
gcc -c sqlite3.c $CFLAGS $DEFINES -o sqlite3.o
ar rcs libsqlite3_embed.a sqlite3.o

# 安装
mkdir -p $PREFIX/{include,lib}
cp sqlite3.h sqlite3ext.h $PREFIX/include/
cp libsqlite3_embed.a $PREFIX/lib/

# 输出信息
echo “Build completed!”
echo “Library: $PREFIX/lib/libsqlite3_embed.a”
ls -lh $PREFIX/lib/libsqlite3_embed.a

执行结果:
$ ./build_embedded.sh
=== Building SQLite for Embedded ===
Compiling…
Build completed!
Library: /sqlite/app/embedded/lib/libsqlite3_embed.a
-rw-r–r– 180K libsqlite3_embed.a

Part05-风哥经验总结与分享

5.1 sqlite数据库编译最佳实践

sqlite数据库编译最佳实践:

1. 版本选择
├── 使用最新稳定版
├── 关注安全更新
├── 测试兼容性
└── 记录版本信息

2. 编译选项
├── 根据需求选择
├── 不要过度裁剪
├── 保留必要功能
└── 测试验证

3. 性能优化
├── 合理优化级别
├── 平台特定优化
├── 启用统计信息
└── 配置缓存大小

4. 安全考虑
├── 启用安全特性
├── 禁用危险功能
├── 定期更新
└── 安全审计

风哥总结:sqlite的编译选项提供了强大的定制能力,可以根据应用场景裁剪功能、优化性能。生产环境建议根据实际需求选择合适的编译选项,嵌入式场景可以大幅裁剪减小库大小,服务器场景可以启用所有功能并优化性能。编译后务必进行功能测试和性能验证。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息