【问题标题】:which has a better performance filter / all in django queryset?哪个有更好的性能过滤器/全部在 django 查询集中?
【发布时间】:2017-10-10 21:18:35
【问题描述】:

假设我有一个名为Best的模型

我想知道如果我不需要查询所有内容,使用Best.objects.all() 是否会是更好的选择,或者Best.objects.filter(this=that) 的整体性能会更好

【问题讨论】:

  • 它们是完全不同的东西,但正如你所问的......如果你有一个有 100 万行的表。调用 .all() 需要返回 100 万行。如果 this == that 仅用于其中 1 行,您最好调用 .filter(this=that),这样您只需从数据库中提取 1 行。
  • @markwalker_ 不调用Best.objects.filter(this=that) 仍然会搜索百万行以确保所有this=that 都被搜索,除非我使用Best.objects.filter(this=that).first() 然后它会查询第一个并且停止
  • 它仍然会经过一百万行,但是会在数据库中进行操作,而不是将数据传输到 python,因此它更有效。
  • @markwalker_ 非常感谢您的解释。我会记住这一点并使用filter 代替:D

标签: python django django-queryset


【解决方案1】:

使用Best.objects.all() 然后使用Python 测试if this == that 不是一个好主意。 Best.objects.filter(this = that) 在数据库执行检查时性能更好。只有满足检查的对象才会在 Python 中可用。

让我们再举一个例子:amount = len(Best.objects.all()) 会比amount = Best.objects.all().count() 慢得多,因为 Python 不必解决这个问题。

【讨论】:

  • 非常感谢,我以前不知道有这样的区别。尤其是lencount() 我会记得使用count() 但话虽如此,为什么人们仍然使用len
  • 有些人不知道count 更高效,我猜其他人不知道它的存在。
猜你喜欢
  • 2017-02-13
  • 2019-05-06
  • 1970-01-01
  • 2011-11-24
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
相关资源
最近更新 更多