我从Django的数据库查询开始需要1-2秒,我无法弄清楚为什么。 不要太大的网站,每秒约1-2个请求(打Django;静态文件只是由nginx提供)。
让我困惑的是,我可以使用debugging模式复制Django shell中的缓慢。 但是,当我在sql提示符下发出完全相同的查询时,它们很快。 查询返回大约需要一秒钟,但是当我检查connection.queries时,它报告的时间低于10毫秒。
下面是一个例子(来自Django shell):
>>> p = PlayerData.objects.get(uid="100000521952372") >>> a = time.time(); p.save(); print time.time() - a 1.96812295914 >>> for d in connection.queries: print d["time"] ... 0.002 0.000 0.000
我怎样才能找出这额外的时间在哪里?
我在守护进程模式下使用Apache + mod_wsgi,但是这也只发生在django shell中,所以我认为它不是与apache相关的。
我有这个问题,除了MySQL。 有一个pipe理页面花了很长时间来加载(15秒),但最慢的查询只有几秒钟的时间。 debugging的几个小时后,我发现它是什么。
mysql数据库服务器的确在几秒钟之内返回查询结果,但是查询并没有完全完成,直到结果返回后才被处理(通过结束,包括清理)。 以下是关于发生了什么的一步一步的解释:
我通过运行“显示完整进程列表”来解决这个问题。 在一个mysql命令提示符下。 对于所有未完成的查询,它显示查询(到目前为止)花费的时间,状态和实际查询文本。 开始昂贵的查询后三到四秒钟,它会开始显示“删除tmp表”作为状态。 在查询已经将结果返回给Django之后,它会显示这一点。 所以显然,MySQL清理查询的时间要比实际返回结果要长得多。 就我而言,这正是问题所在。
有趣的是,“清理”时间并没有出现在查询时间内的查询时间,也没有显示后续查询的起始时间实际上是延迟的。
不知道这是否是你的问题,但我想这是值得研究的。
Django的一个很好的插件是Djangodebugging工具栏(github.com/robhudson/django-debug-toolbar)。 它将向您显示您在每个页面加载时所做的查询(以及每个查询的解释输出)。
你用什么版本的Django? 稳定还是躯干? 1.x的? 0.9X? 只有一件事你可以testing。 什么是“确切查询”的意思。 你用Django使用自定义的SQL查询还是你提取查询并在SQL shell上运行它?
其他的“疯狂猜测”:数据库是否在同一台机器上? 也许你有一个延迟的networking问题。 当你打开SQL提示时,你已经连接到数据库服务器,而Django必须build立连接?
就像我在说这只是一个疯狂的猜测。 由于我们公司的所有防火墙/路由select,我面临的networking问题。 但不是如此高的延迟你有。