sqllite 数据清空以后,空间不释放
SQLite在删除数据后,空间默认不会立即释放给操作系统。这是SQLite的一个设计特性,我来详细解释一下原因和解决方案。
为什么空间不释放?
SQLite使用数据库文件来存储数据,当你删除数据时:- 被删除数据所占用的页面被标记为"空闲",可供后续INSERT操作重用
- 但文件大小不会自动缩小,这是为了性能考虑(避免频繁的文件大小调整)
解决方案
1. VACUUM命令(最常用)
-- 执行VACUUM命令,重新整理数据库文件
VACUUM;
这会重建整个数据库文件,释放未使用的空间,并优化数据库结构。
2. 自动VACUUM模式
-- 启用自动VACUUM(重启后生效)
PRAGMA auto_vacuum = INCREMENTAL; -- 或 FULL
-- 或者手动执行增量VACUUM
PRAGMA auto_vacuum = INCREMENTAL;
PRAGMA incremental_vacuum;
3. 数据库优化设置
-- 设置合适的page_size和cache_size
PRAGMA page_size = 4096;
PRAGMA cache_size = -2000; -- 2000页的缓存
-- 设置WAL模式(写入性能更好)
PRAGMA journal_mode = WAL;
4. 文件级别的处理
如果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需要临时空间:执行VACUUM时需要大约2倍数据库大小的空闲磁盘空间
- VACUUM会锁数据库:在VACUUM期间数据库会被锁定,不适合高并发场景
- 考虑使用WAL模式:WAL模式可以提供更好的并发性能
VACUUM;命令就足够了。
十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》
一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网
浙公网安备 33010602011771号