首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >sqllite 数据清空以后,空间不释放

sqllite 数据清空以后,空间不释放

作者头像
唯一Chat
发布2025-11-30 08:50:27
发布2025-11-30 08:50:27
80
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

SQLite在删除数据后,空间默认不会立即释放给操作系统。这是SQLite的一个设计特性,我来详细解释一下原因和解决方案。

为什么空间不释放?

SQLite使用数据库文件来存储数据,当你删除数据时:

  • 被删除数据所占用的页面被标记为"空闲",可供后续INSERT操作重用
  • 但文件大小不会自动缩小,这是为了性能考虑(避免频繁的文件大小调整)

解决方案

1. VACUUM命令(最常用)

代码语言:javascript
复制
-- 执行VACUUM命令,重新整理数据库文件
VACUUM;

这会重建整个数据库文件,释放未使用的空间,并优化数据库结构。

2. 自动VACUUM模式

代码语言:javascript
复制
-- 启用自动VACUUM(重启后生效)
PRAGMA auto_vacuum = INCREMENTAL;  -- 或 FULL

-- 或者手动执行增量VACUUM
PRAGMA auto_vacuum = INCREMENTAL;
PRAGMA incremental_vacuum;

3. 数据库优化设置

代码语言:javascript
复制
-- 设置合适的page_size和cache_size
PRAGMA page_size = 4096;
PRAGMA cache_size = -2000;  -- 2000页的缓存

-- 设置WAL模式(写入性能更好)
PRAGMA journal_mode = WAL;

4. 文件级别的处理

如果VACUUM后空间仍然很大,可以考虑:

代码语言:javascript
复制
# 导出SQL语句
sqlite3 your_db.db ".dump" > backup.sql

# 重新创建数据库
sqlite3 new_db.db < backup.sql

# 删除原数据库,重命名新数据库
mv new_db.db your_db.db

实际应用建议

代码语言:javascript
复制
-- 定期维护脚本示例
BEGIN TRANSACTION;

-- 删除旧数据
DELETE FROM large_table WHERE created_date < date('now', '-30 days');

-- 执行VACUUM释放空间
VACUUM;

COMMIT;

-- 检查数据库大小
PRAGMA page_count;
PRAGMA page_size;

注意事项

  1. VACUUM需要临时空间:执行VACUUM时需要大约2倍数据库大小的空闲磁盘空间
  2. VACUUM会锁数据库:在VACUUM期间数据库会被锁定,不适合高并发场景
  3. 考虑使用WAL模式:WAL模式可以提供更好的并发性能

一般来说,对于日常使用,定期执行VACUUM;命令就足够了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么空间不释放?
  • 解决方案
    • 1. VACUUM命令(最常用)
    • 2. 自动VACUUM模式
    • 3. 数据库优化设置
    • 4. 文件级别的处理
  • 实际应用建议
  • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档