运行 SQLite 的一些实战心得与踩坑记录

你好!我最近一直在做一个Django网站,决定用SQLite 作为数据库。 当我刚开始用SQLite作为网站数据库时,我读到一个一帮 博客文章中提到在生产环境中使用SQLite完全没问题 网站很小,我觉得完全没问题,但我没完全欣赏 SQLite仍然是数据库,数据库很复杂,我不清楚 很多关于数据库操作的内容。

以下是我最近学到的一些关于运行SQLite的小知识。就是这样 这是我用SQLite做的第四个网站,我觉得这个更难,因为 借助Django ORM的强大功能,我让数据库做的工作量比 我之前没有Django。

我一开始像所有博客文章说的那样打开了WAL模式,抱着侥幸心理。

ANALYZE显然很重要

今天我在运行一个查询(使用SQLite的FTS5对于 全文搜索)在一个有4000行的表格上,整个过程仅用了5秒。那似乎 我觉得错了:电脑很快!

结果我得做的是逃跑分析! 问题查询立刻从5秒变成了大约0.05秒 (或者是其他小到我不想多查的数字)。 我仍然不清楚查询计划到底哪里出了问题, 但我最好的猜测是,那可能是某种偶然二次东西。

ANALYZE生成“统计数据”(我猜是关于每个表格的行数?还有其他信息?) 这样查询规划师才能做出更好的选择。

也许有一天我会学会读查询计划。

清理数据库很棘手

偶尔我会遇到不小心放一堆排的情况 在我的数据库里,我不想在那里(比如完成的任务来自Django-tasks-db),我想把它们清理干净。

我遇到过几次这种情况:

我运行某种命令来清理行

这个命令需要超过5秒,因为行很多(不过说实话我还是有些疑问,为什么这些DELETE语句这么慢,可能是事务里运行了大量Python代码,我不太确定)。

另一个工人试图写入数据库,结果在5秒后超时(我设定了5秒超时)

工作程序崩溃是因为它无法写入数据库,虚拟机也随之关闭

到目前为止,我的做法是分批进行这些清理工作 这样我就不用做超过5秒的数据库查询了 跑。这整个经历让我更加理解为什么有人会这样 可能想用像Postgres这样的“真实”数据库,它可以有多个数据库 不过同时也是作家。

也许将来我会直接关闭网站进行定期维护 而是当我需要做这种事,但我还没弄明白 目前还没准备好。

目前还没有关于 ORM 查询性能的说明

到目前为止,我一直用Django的ORM来做任何查询,且不付费 对查询性能有关注,整体还算顺利 比分析的事更重要。数据库相当小(大概10000行?) 我预计它会一直保持很小,所以我希望这个计划能如此 继续努力。

备份 SQLITE

我用过几种方式做过SQLite备份。我觉得我其实还没真正测试过 我正在从备份中恢复,但我通常会用死人备份来监控它们 换。

途径一:雷斯蒂克

sqlite3 /data/calendar.db “真空进入 '/tmp/calendar.sqlite'” gzip /tmp/calendar.sqlite

上传备份到 S3

有时备份会被彻底击杀,所以它会一直被锁定,解锁一下

Restic -r S3{s3.amazonaws.com/some_bucket/ 解锁

做备份并修剪旧备份

restic -r s3://s3.amazonaws.com/some_bucket/ backup /tmp/calendar.sqlite.gz restic -r s3://s3.amazonaws.com/some_bucket/ 快照 restic -r s3://s3.amazonaws.com/some_bucket/ forget -l 1 -H 6 -d 2 -w 2 -m 2 -y 2 restic -r s3@s3.amazonaws.com/some_bucket/ 修剪

方式二:LiteStream

我最近开始尝试Litestream,因为我觉得做增量备份可能会有帮助 提高效率:我的回收备份有时会被OOM秒杀,我 有点厌倦了。基本上我只需要写一个配置文件然后运行:

Litestream replicate -config litestream.yml

我在配置文件里设置了保留时间:400小时,试图 保留了一些数据库的历史记录,但我不知道它是否能用。

我一直在备份到 AWS,这总是很麻烦,因为很烦人 在AWS控制台中导航生成凭证。也许有一天我会搬走 切换到其他兼容S3的替代方案。

你可以使用多个数据库

我现在的项目只有一个数据库,但我用过一个技巧动DNS吧就是把桌子分成三组 数据库文件,因为我其实不需要我的表都放在同一个数据库里。我觉得这很有帮助。

Mess with DNS 已经在 SQLite 上运行了 4 年(从 2022 年开始),而且 非常棒,我觉得从Postgres转过来是那个项目的好选择。

就这些!

看到我学基础知识花了这么长时间总是挺有趣的 关于我使用的技术。我想我用SQLite做了一个网页项目 这是2022年第一次,我直到今天才知道ANALYZE的存在! 我想一两年后我会学到一些非常基础的功能。

一些参考资料

除了官方文档外,我看过的一些博客文章:关于在生产环境中使用 Django 配合 SQLite 的权威指南关于 SSQLITE 性能调优的要点

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论