首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django查询优化-何时使用sql和何时使用python

django查询优化-何时使用sql和何时使用python
EN

Stack Overflow用户
提问于 2014-10-29 15:32:15
回答 3查看 467关注 0票数 0

我正在寻找关于何时重新查询数据库更快,何时使用python并从缓存中提取数据更快的一般经验规则。

让我们假设我需要从数据库中提取两件simultaniously:所有的比萨,以及带有pk=5的特定比萨饼。

更优化的是:

代码语言:javascript
复制
pizzas = Pizza.objects.all()   
specific_pizza = Piazza.objects.get(pk=5)

代码语言:javascript
复制
pizzas = Pizza.objects.all()
for pizza in pizzas:
    if pizza.pk == 5
        specific_pizza = pizza
        break 

当然,这取决于数据库。例如,如果比萨是1千万行,那么很明显,重新查询sql更好,如果比萨是10行,即使字段是索引的,python也可能更快。

有人能帮到什么在中间范围更优化吗?例如,比萨饼是几百排吗?上千排?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-02 09:40:13

我很感谢@ch3ka和@goncalopp的回复,但我认为它们并没有直接回答这个问题,下面是我对自己的一些描述:

总之,我发现python查找甚至与sql类似,大约有1000个条目:

假设我已经查询了数据库并收到了1000个比萨:

代码语言:javascript
复制
pizzas = Pizza.objects.all()

我做了两次测试:

Test1:通过查看pk,在1000个比萨饼中找到一个特定的比萨:

代码语言:javascript
复制
for pizza in pizzas:
    if pizza.pk == 500
        specific_pizza = pizza
        break 

花了0.2毫秒

Test2:根据比萨饼的一个成员进行过滤,并创建一个新列表:

代码语言:javascript
复制
mushroom_pizzas=[pizza for pizza in pizzas if pizza.topping==Pizza.MUSHROOM]

蘑菇是一种可能的配料。我选择了enum,因为我认为它与索引DB字段的比较是正确的

花了0.3毫秒

使用Django调试工具栏,一个简单的索引sql查询所需的时间约为0.3毫秒。

我确实像@goncalopp和@ch3ka一样认为,由于简单的索引查询已经是0.3毫秒,所以没有必要使用python进行优化。因此,即使我事先知道条目的数量将小于1000,甚至远小于1000,我仍然会始终使用sql。

如果我做错了估计或得出了错误的结论,我将非常感谢你的评论。

票数 0
EN

Stack Overflow用户

发布于 2014-10-29 16:01:50

这个问题没有明确的答案--正如您所说,它取决于数据库(可能还取决于数据库的位置、表的数量和大小,.)。您必须在特定的环境中进行测试。

除了原始速度之外,使用第一个版本还有一些重要的优点:

  • 它更短更清晰
  • ORM完全知道您想要什么,因此任何进一步的优化都可以在该级别进行,而不是将它们推送到您的应用程序中。
  • 它避免在web服务器中进行(潜在的)密集计算。

另外,还有一些值得思考的地方:如果您的表足够小,以至于python比DB更快,那么速度重要吗?

您可能想阅读关于过早优化的文章。

票数 2
EN

Stack Overflow用户

发布于 2014-10-29 16:05:27

例如,如果比萨是1千万行,那么很明显,重新查询sql更好,如果比萨是10行,即使字段是索引的,python也可能更快。

好吧..。第一次发言:是的。第二句话:不确定,但也不重要。因为当比萨只有很少的时候,邻居命令就会花费相当长的时间。

有人能帮到什么在中间范围更优化吗?

我想,这与你所期望的不一样,但我想是的:既然我们一致认为,当比萨很多的时候,使用.get()会更快,而且考虑到比萨的数量将来可能会增加,我们只会关注性能,所以我认为我们可以同意使用.get()是正确的做法。

撇开性能不说--它显然也更易读,所以你真的应该走这条路。

另外,请注意,您可以在QuerySet上使用方法(.all()返回QuerySet!)过滤你想要的。这是如何工作是“魔术幕后”-因此,假设是优化的,直到证据被发现与该假设。因此,您应该使用这些方法,直到达到真正需要目标优化的程度为止。如果你达到这一点,你可以基准测试,并有一个可靠的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26634438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档