我在写网站:在C++中,作为nginx模块,使用SQLite。网站的浏览量通常很大。让我们也假设一个巨大的数据库,只是为了从一开始就覆盖所有的端点。
我希望它快速,包括即时启动/停止。
如果我按照建议在每个连接关闭时运行pragma optimize
,最终它将冻结思维,并沿着运行系统管理员:为什么Nginx冻结了?如果我每隔几个小时在工作连接上运行pragma optimize
(每个nginx工作线程一个连接),偶尔会想到的会是用户。
当然,我会事先发出pragma analyze_limit = 1000
,但我内心的完美主义者仍然抱怨。在sqlite3_interrupt()
上,他抱怨得更多。
所以,我想用单独的连接运行后台线程,并在那里做所有的维护,包括每隔几个小时的pragma optimize
。这是一个非常典型的模式:应用程序内类似cron的东西。
问题:
-- 1 --与关闭真实的工作连接之前运行pragma optimize
相比,我会损失多少?
我将抑制MASK位8(自动创建索引,尚未实现),因为我不喜欢有人为我做如此深远的决定,更不用说自动做了。但除此之外,optimize
是否至少仍会为所有适当的表调用analyze
?
**-- 2 --**如果我在后台线程中运行pragma optimize
,是否会阻塞worker连接执行的DML?
如果没有,那就太理想了:网站将从一开始就工作得很快,即使在以前的优化过程中系统管理员杀死了nginx;即使没有pragma analyze_limit
,后台线程也有足够的时间来完成它的工作--在启动时和每隔几个小时;当所有连接在终止时关闭时,它们的pragma optimize
将是NOOP的可能性约为100%。
Thanks.:)
1条答案
按热度按时间fslejnso1#
我被建议定期(例如,在10万次查询后)在工作线程中创建新的连接,并将旧的连接移动到后台线程进行维护和关闭。
至于我的想法,运行优化在单独的连接工作,位4的
pragma optimize
掩码必须实现。