1. 首页 > sqlite教程 > 正文

sqlite教程FG008-PRAGMA指令与运行时参数调优

本文档风哥主要介绍sqlite数据库PRAGMA指令与运行时参数调优相关知识,包括sqlite数据库PRAGMA指令概述、PRAGMA分类详解、运行时参数机制等内容,风哥教程参考sqlite官方文档PRAGMA Statements等内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 sqlite数据库PRAGMA指令概述

PRAGMA是sqlite特有的指令,用于配置数据库连接参数、查询数据库状态和控制数据库行为。更多视频教程www.fgedu.net.cn

1.1.1 PRAGMA指令特点

sqlite数据库PRAGMA指令特点:

1. 语法特点
├── 类似SQL语句
├── 不需要分号结尾
├── 可读可写
└── 连接级别生效

2. 作用范围
├── 连接级别:仅当前连接生效
├── 数据库级别:影响整个数据库
└── 持久化:部分可保存到数据库

3. 使用方式
├── 查询:PRAGMA pragma_name;
├── 设置:PRAGMA pragma_name = value;
└── 函数式:pragma_name(value)

4. 注意事项
├── 部分PRAGMA需要特定权限
├── 部分PRAGMA在事务中不可用
├── 设置顺序可能影响效果
└── 建议在连接建立时配置

PRAGMA语法示例:
sqlite> PRAGMA cache_size; — 查询
sqlite> PRAGMA cache_size = 1000; — 设置

1.1.2 PRAGMA指令分类

sqlite数据库PRAGMA指令分类:

1. 配置类PRAGMA
├── cache_size 页面缓存大小
├── journal_mode 日志模式
├── synchronous 同步模式
├── locking_mode 锁定模式
└── temp_store 临时存储位置

2. 查询类PRAGMA
├── database_list 数据库列表
├── table_info 表结构信息
├── index_info 索引信息
├── page_count 页面数量
└── page_size 页面大小

3. 维护类PRAGMA
├── integrity_check 完整性检查
├── wal_checkpoint WAL检查点
├── vacuum 清理数据库
└── optimize 优化索引

4. 安全类PRAGMA
├── foreign_keys 外键约束
├── ignore_check_constraints 忽略检查约束
└── secure_delete 安全删除

5. 调试类PRAGMA
├── compile_options 编译选项
├── version 版本信息
└── lock_status 锁状态

1.2 sqlite数据库PRAGMA分类详解

以下是sqlite数据库常用PRAGMA指令的详细说明。学习交流加群风哥微信: itpux-com

1.2.1 核心配置PRAGMA

sqlite数据库核心配置PRAGMA:

1. journal_mode(日志模式)
├── DELETE:默认,删除日志文件
├── TRUNCATE:截断日志文件
├── PERSIST:保留日志文件
├── MEMORY:内存日志
├── WAL:预写日志(推荐)
└── OFF:禁用日志

2. synchronous(同步模式)
├── OFF (0):不同步,最快但不安全
├── NORMAL (1):正常同步,推荐
├── FULL (2):完全同步,最安全
└── EXTRA (3):额外同步,最安全最慢

3. cache_size(缓存大小)
├── 正数:页面数量
├── 负数:KB数量
├── 默认:-2000(约2MB)
└── 建议:-64000(约64MB)

4. locking_mode(锁定模式)
├── NORMAL:正常模式
└── EXCLUSIVE:独占模式

5. temp_store(临时存储)
├── DEFAULT (0):默认
├── FILE (1):文件
├── MEMORY (2):内存
└── 建议:MEMORY

6. page_size(页面大小)
├── 范围:512-65536
├── 默认:4096
└── 必须在创建数据库时设置

1.2.2 WAL相关PRAGMA

sqlite数据库WAL相关PRAGMA:

1. wal_autocheckpoint
├── 自动checkpoint阈值
├── 单位:页面数
├── 默认:1000
└── 建议:500-2000

2. wal_checkpoint
├── 执行checkpoint操作
├── PASSIVE:被动模式
├── RESTART:重启模式
└── TRUNCATE:截断模式

3. journal_size_limit
├── 日志文件大小限制
├── 单位:字节
├── 默认:-1(无限制)
└── 建议:根据磁盘空间设置

WAL配置示例:
sqlite> PRAGMA journal_mode = WAL;
sqlite> PRAGMA wal_autocheckpoint = 500;
sqlite> PRAGMA synchronous = NORMAL;
sqlite> PRAGMA wal_checkpoint(TRUNCATE);

1.3 sqlite数据库运行时参数机制

sqlite的运行时参数决定了数据库的行为和性能,理解这些参数对于调优非常重要。更多学习教程公众号风哥教程itpux_com

1.3.1 参数生效范围

sqlite数据库参数生效范围:

1. 连接级别参数
├── 仅对当前连接生效
├── 连接关闭后失效
├── 示例:cache_size、busy_timeout
└── 需要每次连接时设置

2. 数据库级别参数
├── 对所有连接生效
├── 保存在数据库文件中
├── 示例:page_size、journal_mode
└── 设置后持久化

3. 编译级别参数
├── 编译时确定
├── 运行时不可修改
├── 示例:SQLITE_MAX_PAGE_SIZE
└── 需要重新编译修改

参数设置时机:
┌─────────────────┬──────────────────────────┐
│ 参数类型 │ 设置时机 │
├─────────────────┼──────────────────────────┤
│ page_size │ 创建数据库时 │
│ journal_mode │ 连接建立时 │
│ cache_size │ 连接建立时 │
│ synchronous │ 连接建立时 │
│ busy_timeout │ 连接建立时 │
└─────────────────┴──────────────────────────┘

Part02-生产环境规划与建议

2.1 sqlite数据库PRAGMA配置规划

合理的PRAGMA配置是数据库性能优化的基础。风哥提示:PRAGMA配置需要根据实际场景调整。

2.1.1 生产环境推荐配置

sqlite数据库生产环境推荐配置:

基础配置:
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = -64000;
PRAGMA temp_store = MEMORY;
PRAGMA busy_timeout = 5000;
PRAGMA foreign_keys = ON;

WAL配置:
PRAGMA wal_autocheckpoint = 500;

安全配置:
PRAGMA secure_delete = ON;
PRAGMA foreign_keys = ON;

性能配置:
PRAGMA mmap_size = 268435456;
PRAGMA page_size = 4096;

配置脚本示例:
#!/bin/bash
# init_pragma.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

DB=”/sqlite/fgdata/fgedudb.db”

sqlite3 $DB <

2.2 sqlite数据库性能参数规划

性能参数的合理规划可以显著提升数据库性能。学习交流加群风哥微信: itpux-com

2.2.1 性能参数配置建议

sqlite数据库性能参数配置建议:

1. 缓存配置
├── cache_size:根据内存大小设置
├── 小内存:-2000(2MB)
├── 中内存:-64000(64MB)
├── 大内存:-256000(256MB)
└── 建议:物理内存的10-20%

2. WAL配置
├── 高写入:wal_autocheckpoint=500
├── 中写入:wal_autocheckpoint=1000
├── 低写入:wal_autocheckpoint=2000
└── 定期手动checkpoint

3. 同步配置
├── 数据安全优先:synchronous=FULL
├── 性能优先:synchronous=NORMAL
└── 不推荐:synchronous=OFF

4. 内存映射
├── mmap_size:启用内存映射IO
├── 小文件:268435456(256MB)
├── 大文件:1073741824(1GB)
└── 建议:根据文件大小设置

5. 临时存储
├── temp_store=MEMORY:临时表在内存
└── 提高临时表操作性能

不同场景配置:
┌─────────────────┬──────────────────────────┐
│ 场景 │ 推荐配置 │
├─────────────────┼──────────────────────────┤
│ Web应用 │ WAL + NORMAL + 64MB缓存 │
│ 嵌入式设备 │ DELETE + FULL + 2MB缓存 │
│ 数据分析 │ WAL + NORMAL + 256MB缓存 │
│ 批处理 │ WAL + NORMAL + 大缓存 │
└─────────────────┴──────────────────────────┘

2.3 sqlite数据库安全参数规划

安全参数的合理规划可以保护数据安全。更多学习教程公众号风哥教程itpux_com

2.3.1 安全参数配置建议

sqlite数据库安全参数配置建议:

1. 外键约束
├── foreign_keys = ON
├── 保证参照完整性
└── 生产环境必须启用

2. 安全删除
├── secure_delete = ON
├── 删除时覆盖数据
└── 防止数据恢复

3. 检查约束
├── ignore_check_constraints = OFF
├── 启用CHECK约束
└── 保证数据有效性

4. 数据加密
├── 使用SEE扩展
├── 或使用SQLCipher
└── 敏感数据必须加密

安全配置脚本:
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA secure_delete = ON;
sqlite> PRAGMA ignore_check_constraints = OFF;

验证配置:
sqlite> PRAGMA foreign_keys;
foreign_keys
————
1

sqlite> PRAGMA secure_delete;
secure_delete
————-
1

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

3.1 sqlite数据库PRAGMA配置实战

以下是sqlite数据库PRAGMA配置的实际操作。学习交流加群风哥QQ113257174

3.1.1 查看当前配置

查看所有PRAGMA配置:
sqlite> PRAGMA compile_options;
ENABLE_FTS3
ENABLE_FTS4
ENABLE_FTS5
ENABLE_JSON1
ENABLE_RTREE
THREADSAFE=1

查看数据库信息:
sqlite> PRAGMA database_list;
seq name file
— —- ———————–
0 main /sqlite/fgdata/fgedudb.db

sqlite> PRAGMA page_size;
page_size
———
4096

sqlite> PRAGMA page_count;
page_count
———-
128

sqlite> PRAGMA database_size;
database_size
————-
524288

查看表信息:
sqlite> PRAGMA table_info(fgedu_users);
cid name type notnull dflt_value pk
— ———— ——- ——- ———- —
0 id INTEGER 0 1
1 username TEXT 1 0
2 email TEXT 0 0

查看索引信息:
sqlite> PRAGMA index_list(fgedu_users);
seq name unique origin partial
— ————— —— —— ——-
0 idx_users_email 0 c 0

3.1.2 配置PRAGMA参数

配置日志模式:
sqlite> PRAGMA journal_mode;
journal_mode
————
delete

sqlite> PRAGMA journal_mode = WAL;
journal_mode
————
wal

配置缓存大小:
sqlite> PRAGMA cache_size = -64000;

sqlite> PRAGMA cache_size;
cache_size
———-
-64000

配置同步模式:
sqlite> PRAGMA synchronous = NORMAL;

sqlite> PRAGMA synchronous;
synchronous
———–
1

配置外键约束:
sqlite> PRAGMA foreign_keys = ON;

sqlite> PRAGMA foreign_keys;
foreign_keys
————
1

配置锁超时:
sqlite> PRAGMA busy_timeout = 10000;

sqlite> PRAGMA busy_timeout;
busy_timeout
————
10000

批量配置脚本:
#!/bin/bash
# config_pragma.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

DB=”/sqlite/fgdata/fgedudb.db”

echo “=== SQLite PRAGMA Configuration ===”

sqlite3 $DB <

3.2 sqlite数据库性能调优实战

以下是sqlite数据库性能调优的实际操作。风哥提示:性能调优需要根据实际负载进行。

3.2.1 缓存优化

查看缓存状态:
sqlite> PRAGMA cache_status;
cache_size lookaside cache_used schema_used
———- ——— ———- ———–
-64000 0 262144 8192

调整缓存大小:
sqlite> PRAGMA cache_size = -128000;

sqlite> PRAGMA cache_status;
cache_size lookaside cache_used schema_used
———- ——— ———- ———–
-128000 0 524288 8192

内存映射IO:
sqlite> PRAGMA mmap_size = 268435456;

sqlite> PRAGMA mmap_size;
mmap_size
———
268435456

性能测试:
#!/bin/bash
# cache_test.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

DB=”/sqlite/fgdata/fgedudb.db”

echo “=== Cache Performance Test ===”

# 测试小缓存
echo “Small Cache (2MB):”
time sqlite3 $DB “PRAGMA cache_size = -2000; SELECT COUNT(*) FROM fgedu_users;”

# 测试大缓存
echo “Large Cache (64MB):”
time sqlite3 $DB “PRAGMA cache_size = -64000; SELECT COUNT(*) FROM fgedu_users;”

执行结果:
$ ./cache_test.sh
=== Cache Performance Test ===
Small Cache (2MB):
COUNT(*)
——–
10004
real 0m0.152s

Large Cache (64MB):
COUNT(*)
——–
10004
real 0m0.089s

3.2.2 WAL优化

查看WAL状态:
sqlite> PRAGMA wal_checkpoint;
busy log checkpointed
—- — ————
0 50 50

配置自动checkpoint:
sqlite> PRAGMA wal_autocheckpoint = 500;

sqlite> PRAGMA wal_autocheckpoint;
wal_autocheckpoint
——————
500

手动checkpoint:
sqlite> PRAGMA wal_checkpoint(PASSIVE);
busy log checkpointed
—- — ————
0 0 0

sqlite> PRAGMA wal_checkpoint(TRUNCATE);
busy log checkpointed
—- — ————
0 0 0

查看WAL文件:
$ ls -lh /sqlite/fgdata/fgedudb.db-wal
-rw-r–r– 1 sqlite sqlite 0 Apr 8 10:00 /sqlite/fgdata/fgedudb.db-wal

WAL监控脚本:
#!/bin/bash
# wal_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

DB=”/sqlite/fgdata/fgedudb.db”
WAL_FILE=”${DB}-wal”

echo “=== WAL Monitor ===”
echo “Time: $(date)”
echo “WAL Size: $(ls -lh $WAL_FILE | awk ‘{print $5}’)”
sqlite3 $DB “PRAGMA wal_checkpoint;”
sqlite3 $DB “PRAGMA wal_autocheckpoint;”

3.3 sqlite数据库维护PRAGMA实战

以下是sqlite数据库维护PRAGMA的实际操作。更多视频教程www.fgedu.net.cn

3.3.1 完整性检查

快速完整性检查:
sqlite> PRAGMA quick_check;
quick_check
———–
ok

完整完整性检查:
sqlite> PRAGMA integrity_check;
integrity_check
—————
ok

检查特定表:
sqlite> PRAGMA integrity_check(fgedu_users);
integrity_check
—————
ok

检查外键约束:
sqlite> PRAGMA foreign_key_check;
— 无输出表示无问题

检查外键约束(有问题时):
sqlite> PRAGMA foreign_key_check;
table rowid parent fkid
——– ——– ——– —-
fgedu_orders 5 fgedu_users 0

3.3.2 数据库优化

优化索引统计信息:
sqlite> PRAGMA optimize;
optimize
——–
ok

查看优化建议:
sqlite> PRAGMA optimize(0x10000);
— 显示优化建议

重建索引:
sqlite> REINDEX;

sqlite> REINDEX fgedu_users;

清理数据库:
sqlite> VACUUM;

查看数据库信息:
sqlite> PRAGMA page_count;
page_count
———-
120

sqlite> PRAGMA freelist_count;
freelist_count
————–
0

数据库维护脚本:
#!/bin/bash
# db_maintenance.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

DB=”/sqlite/fgdata/fgedudb.db”

echo “=== Database Maintenance ===”
echo “Time: $(date)”

echo “1. Integrity Check…”
sqlite3 $DB “PRAGMA integrity_check;”

echo “2. Foreign Key Check…”
sqlite3 $DB “PRAGMA foreign_key_check;”

echo “3. Optimize…”
sqlite3 $DB “PRAGMA optimize;”

echo “4. Checkpoint…”
sqlite3 $DB “PRAGMA wal_checkpoint(TRUNCATE);”

echo “5. Database Info…”
sqlite3 $DB “SELECT ‘Page Count: ‘ || page_count FROM pragma_page_count;”
sqlite3 $DB “SELECT ‘Free Pages: ‘ || freelist_count FROM pragma_freelist_count;”

echo “Maintenance completed”

Part04-生产案例与实战讲解

4.1 sqlite数据库配置优化案例

以下是sqlite数据库配置优化的实际案例。学习交流加群风哥微信: itpux-com

4.1.1 Web应用配置优化案例

场景:高并发Web应用

初始配置:
├── journal_mode: delete
├── synchronous: FULL
├── cache_size: -2000
├── busy_timeout: 0
└── 性能:TPS 50

优化配置:
sqlite> PRAGMA journal_mode = WAL;
sqlite> PRAGMA synchronous = NORMAL;
sqlite> PRAGMA cache_size = -64000;
sqlite> PRAGMA busy_timeout = 10000;
sqlite> PRAGMA temp_store = MEMORY;
sqlite> PRAGMA mmap_size = 268435456;

优化后性能:
├── TPS: 500
├── 响应时间: 20ms
└── 错误率: 0.01%

配置持久化脚本:
#!/bin/bash
# web_config.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

DB=”/sqlite/fgdata/fgedudb.db”

sqlite3 $DB <

4.2 sqlite数据库性能调优案例

以下是sqlite数据库性能调优的实际案例。风哥提示:性能调优需要持续监控和调整。

4.2.1 批量导入性能优化

场景:批量导入100万条数据

初始方案:
sqlite> INSERT INTO fgedu_data VALUES (…); — 逐条插入
— 耗时:30分钟

优化方案:
sqlite> PRAGMA journal_mode = OFF;
sqlite> PRAGMA synchronous = OFF;
sqlite> PRAGMA cache_size = -256000;

sqlite> BEGIN TRANSACTION;
sqlite> INSERT INTO fgedu_data VALUES (…); — 批量插入
sqlite> COMMIT;

sqlite> PRAGMA journal_mode = WAL;
sqlite> PRAGMA synchronous = NORMAL;

— 耗时:2分钟

性能对比:
┌─────────────────┬──────────┬──────────┐
│ 方案 │ 耗时 │ 性能提升 │
├─────────────────┼──────────┼──────────┤
│ 初始方案 │ 30分钟 │ 基准 │
│ 优化方案 │ 2分钟 │ 15倍 │
└─────────────────┴──────────┴──────────┘

批量导入脚本:
#!/bin/bash
# bulk_import.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

DB=”/sqlite/fgdata/fgedudb.db”
DATA_FILE=”/sqlite/data/import.csv”

echo “=== Bulk Import ===”
echo “Start: $(date)”

sqlite3 $DB <

4.3 sqlite数据库问题排查案例

以下是sqlite数据库问题排查的实际案例。更多学习教程公众号风哥教程itpux_com

4.3.1 数据库损坏排查

问题描述:
应用报错 “database disk image is malformed”

排查步骤:

1. 完整性检查:
sqlite> PRAGMA integrity_check;
integrity_check
—————
*** in database main ***
Page 100: btree pointer size mismatch
On tree page 100 cell 5: invalid page number 0

2. 尝试恢复:
$ sqlite3 fgedudb.db “.recover” > recover.sql
$ sqlite3 fgedudb_recovered.db < recover.sql 3. 验证恢复结果: sqlite> PRAGMA integrity_check;
integrity_check
—————
ok

4. 数据对比:
sqlite> SELECT COUNT(*) FROM fgedu_users;
COUNT(*)
——–
10004

sqlite> SELECT COUNT(*) FROM main.fgedu_users;
COUNT(*)
——–
10002

5. 替换原数据库:
$ cp fgedudb_recovered.db fgedudb.db

预防措施:
├── 定期备份
├── 启用WAL模式
├── 定期完整性检查
├── 监控磁盘空间
└── 使用UPS电源

Part05-风哥经验总结与分享

5.1 sqlite数据库PRAGMA最佳实践

基于多年的实践经验,以下是sqlite数据库PRAGMA的最佳实践总结。学习交流加群风哥QQ113257174

5.1.1 PRAGMA最佳实践总结

sqlite数据库PRAGMA最佳实践:

1. 配置时机
├── 连接建立时立即配置
├── 使用初始化脚本
├── 避免运行时频繁修改
└── 保持配置一致性

2. 推荐配置
├── journal_mode = WAL
├── synchronous = NORMAL
├── cache_size = -64000
├── busy_timeout = 5000
├── foreign_keys = ON
└── temp_store = MEMORY

3. 性能优化
├── 根据内存调整缓存
├── 启用内存映射IO
├── 合理设置checkpoint
└── 定期执行维护

4. 安全配置
├── 启用外键约束
├── 启用安全删除
├── 定期完整性检查
└── 加密敏感数据

5. 监控维护
├── 监控关键指标
├── 定期执行优化
├── 记录配置变更
└── 制定恢复计划

5.2 sqlite数据库参数调优技巧

以下是sqlite数据库参数调优的技巧总结。from sqlite视频:www.itpux.com

5.2.1 参数调优技巧汇总

sqlite数据库参数调优技巧:

1. 缓存调优
├── 小数据量:2-8MB
├── 中数据量:32-64MB
├── 大数据量:128-256MB
└── 监控缓存命中率

2. WAL调优
├── 高写入:checkpoint=500
├── 中写入:checkpoint=1000
├── 低写入:checkpoint=2000
└── 监控WAL大小

3. 同步调优
├── 安全优先:FULL
├── 平衡模式:NORMAL
├── 性能优先:NORMAL
└── 不推荐:OFF

4. 连接调优
├── 设置合理超时
├── 使用连接池
├── 控制并发数
└── 监控锁等待

5. 维护调优
├── 定期VACUUM
├── 定期ANALYZE
├── 定期checkpoint
└── 定期完整性检查

5.3 sqlite数据库配置管理总结

综合各种因素,以下是sqlite数据库配置管理的总结。更多视频教程www.fgedu.net.cn

5.3.1 配置管理总结

sqlite数据库配置管理总结:

核心配置:
├── journal_mode = WAL
├── synchronous = NORMAL
├── cache_size = -64000
├── busy_timeout = 5000
├── foreign_keys = ON
└── temp_store = MEMORY

性能配置:
├── mmap_size = 268435456
├── wal_autocheckpoint = 500
└── cache_size根据内存调整

安全配置:
├── foreign_keys = ON
├── secure_delete = ON
└── 定期完整性检查

维护配置:
├── 定期VACUUM
├── 定期ANALYZE
├── 定期checkpoint
└── 监控告警

配置管理流程:
├── 1. 分析应用需求
├── 2. 制定配置方案
├── 3. 测试验证效果
├── 4. 生产环境部署
├── 5. 持续监控优化
└── 6. 定期回顾调整

风哥总结:PRAGMA指令是sqlite数据库配置和调优的核心工具。合理配置PRAGMA参数可以显著提升数据库性能和可靠性。生产环境建议使用WAL模式、NORMAL同步模式、适当的缓存大小,并启用外键约束。定期执行维护操作,监控关键指标,持续优化配置。

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

联系我们

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

微信号:itpux-com

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