SQLite在删除数据后,空间默认不会立即释放给操作系统。这是SQLite的一个设计特性,我来详细解释一下原因和解决方案。
SQLite使用数据库文件来存储数据,当你删除数据时:
-- 执行VACUUM命令,重新整理数据库文件
VACUUM;这会重建整个数据库文件,释放未使用的空间,并优化数据库结构。
-- 启用自动VACUUM(重启后生效)
PRAGMA auto_vacuum = INCREMENTAL; -- 或 FULL
-- 或者手动执行增量VACUUM
PRAGMA auto_vacuum = INCREMENTAL;
PRAGMA incremental_vacuum;-- 设置合适的page_size和cache_size
PRAGMA page_size = 4096;
PRAGMA cache_size = -2000; -- 2000页的缓存
-- 设置WAL模式(写入性能更好)
PRAGMA journal_mode = WAL;如果VACUUM后空间仍然很大,可以考虑:
# 导出SQL语句
sqlite3 your_db.db ".dump" > backup.sql
# 重新创建数据库
sqlite3 new_db.db < backup.sql
# 删除原数据库,重命名新数据库
mv new_db.db your_db.db-- 定期维护脚本示例
BEGIN TRANSACTION;
-- 删除旧数据
DELETE FROM large_table WHERE created_date < date('now', '-30 days');
-- 执行VACUUM释放空间
VACUUM;
COMMIT;
-- 检查数据库大小
PRAGMA page_count;
PRAGMA page_size;一般来说,对于日常使用,定期执行VACUUM;命令就足够了。