我有一个PostgreSQL数据库,其中包含近2000行的表。客户端加载前75行,当用户向下滚动时,客户端加载另外75行。我的任务是优化其他数据的加载。
实际检索数据有三个查询。其中两个每个需要50毫秒,另一个需要150毫秒,总计250毫秒,而Python代码执行的实际时间是600毫秒。我测量了每个查询的执行情况,然后打印了查询。我注意到第一个查询需要额外的350毫秒来执行,但connection.queries
表示查询花了50毫秒。
我删除了第一个查询(用虚拟替换它)并注意到现在时间是550毫秒,第二个查询需要额外的350毫秒。我添加了第一个查询并用原始SQL替换它:
cursor = connection.cursor()
t_count_query = time.time()
cursor.execute('...')
result = cursor.fetchone()[0] # the result of this query is a single value
而不是一行我现在有connection.cursor()
然后是实际的查询。我决定用这段代码单独计时:
t_connecting = time.time()
cursor = connection.cursor()
t_connecting = time.time() - t_connecting
print 'Connection time: {0}'.format(t_connecting)
t_count_query = time.time()
cursor.execute('...')
result = cursor.fetchone()[0]
t_count_query = time.time() - t_count_query
print 'Count query: {0}'.format(t_count_query)
输出:
Connection time: 0.367555141449
Count query: 0.0511040687561
正如您所见,connection.cursor()
大约需要350毫秒,查询大约需要50毫秒。这也解释了为什么第二个查询在第一个查询不存在时需要350毫秒。 Django查询(我的意思是像MyModel.objects.all()
)也必须连接到数据库,在我的情况下需要大约350ms。
因此,每当用户在客户端上结束时,服务器必须打开新连接并浪费350毫秒。当用户按下“下一步”时,它就可以了。按钮以获取另一页数据。在这种情况下,350毫秒几乎没有任何区别。但是当客户端是一个长的可滚动页面时,每次用户点击结束时等待都会产生恼人的用户体验。
因此,我的问题是,我可以以某种方式在指定的时间内保存与数据库的连接,例如10分钟,以使客户端的滚动更顺畅吗?
修改
我用谷歌搜索了django持续连接'我发现CONN_MAX_AGE
并将其设置为300.有趣的是,现在50ms查询大约需要100ms。测量它给了我740ms!并且要求不超过SECOND!一段时间(约5分钟)后,时间达到正常600毫秒。
因此,现在我有另一个问题。持久连接如何比默认CONN_MAX_AGE=0
慢?是否有其他方法来建立持久连接,我应该使用它而不是设置CONN_MAX_AGE
?