我正在写网站:用C++,作为nginx模块,使用SQLite。网站的正常运行时间通常很长。我们还假设数据库很大,只是为了从一开始就涵盖所有目的。
我想要快速,包括即时启动/停止。
pragma optimize
,最终它会冻结思维,系统管理员也会随之思考:为什么 nginx 冻结了?杀了它!如果我每隔几个小时在工作连接上运行 pragma optimize
(每个 nginx 工作线程一个连接),偶尔想到的将是用户。
pragma analyze_limit = 1000
,但我内心的完美主义者仍然抱怨。在sqlite3_interrupt()
,他抱怨得更多。
因此,我想使用单独的连接运行后台线程,并在那里进行所有维护,包括每隔几个小时进行
pragma optimize
。这是一个非常典型的模式:应用程序内类似 cron 的东西。
问题:
-- 1 -- 与关闭
real工作连接之前运行
pragma optimize
相比,我会损失多少?
我会抑制MASK位8(自动创建索引,尚未实现),因为我不喜欢有人为我做如此影响深远的决定,更不用说自动做它了。但除此之外,
optimize
至少还会为所有合适的桌子调用analyze
吗?
-- 2 -- 如果我在后台线程中运行
pragma optimize
,它会阻止由工作连接执行的DML吗?
如果没有,那将是理想的:即使系统管理员在之前的优化过程中杀死了 nginx,站点从一开始就能快速运行;即使没有
pragma analyze_limit
,后台线程也将有足够的时间来完成其工作——启动时和每隔几个小时;当所有连接在终止时关闭时,它们的 pragma optimize
为 NOOP 的可能性约为 100%。
谢谢。 :)
我被建议定期(例如在 100K 查询之后)在工作线程中创建新连接,并将旧连接移至后台线程以进行维护和关闭。