【问题标题】:Django: bigger querysets & small no. of database hits or vice versaDjango:更大的查询集和小号。数据库命中数,反之亦然
【发布时间】:2015-08-17 04:44:03
【问题描述】:

我正在开发一个关于 django 和 MySQL 的网站,该网站在复杂性和功能方面与linkedin 相似,并且预计会在几个月内快速增长。

我有一个问题。在设计模型和视图时,我有两个选择。要么选择更少的数据库命中并处理更大的查询集(通过进行更复杂的查询和更多的连接),要么处理更小的查询集,从而增加数据库命中的数量。例如,当我使用 prefetch_related() 和 select_related() 时,没有。数据库命中数显着减少,但查询集的大小和对表执行的连接数增加。这只是一个例子。

所以考虑到生产条件,我应该在上述两个中更喜欢什么。稍微解释一下会更好。

【问题讨论】:

  • 不,目前没有。因为我在某处读到,除非网站上的点击次数增加太多,否则没有必要。
  • 我猜,您仍在使用 django 的默认缓存。当然,对于小型应用程序来说,这不是必需的。但建议这样做。基本逻辑是您在逻辑和数据库之间创建了一个附加层。因此,您不必为所有数据访问数据库。
  • 您的问题在很大程度上取决于很多因素。你存储什么样的数据?您正在执行什么样的查询?什么是最受欢迎的?你需要他们的所有数据吗?您将如何扩展您的应用程序?没有“总是这样做”的答案。
  • 所以,如果我使用 memcached,那么在加载新闻源时,当第一个用户访问数据库时,我可以将结果存储在缓存中,当下一个用户加载新闻源时,在正常情况下,数据库不会被击中?但是这又是几乎相同的问题,缓存将利用 RAM,没有缓存,更多的数据库命中。我应该选择哪一个。
  • 是的,你是对的。但我们又回到了因素的数量上。你有大量的内存吗?如果是的话 - 一切都很好。如果不是 - 好吧,我想你明白了。

标签: mysql django django-queryset django-orm


【解决方案1】:

最好选择较少数量的数据库命中,因为当性能至关重要时,这也可能成为您的瓶颈。

获得更多点击几乎就像每次您想读取一行时都在硬盘上敲击一个文件。当然,最终答案取决于您的使用频率以及通过将查询放在一起获得的实际收益。例如,这是否意味着您必须将数据缓存更长时间?如果您的应用必须为大量用户做同样的事情,它将如何影响您的应用?

开始的一种方法是尝试减少同一函数中查询集的数量 - 如果一个函数执行 100 个单独的查询,那么如果可能的话,您可以将它们放在一起做得更好。

【讨论】:

  • 这是一个很好的解释,但目前,我正在执行 50 次连接来加载新闻源,其中许多都被重复。随着更多的数据库点击次数,我可以将其减少到 15-20 个连接。所以我该怎么做。使用缓存框架或依赖 django 默认缓存。
  • 软件中最大的错误之一是过早优化。暂时使用 django 默认缓存,除非你找到了放弃它的理由。使用 1gb 内存,您很快就会发现不足(如果有的话)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
相关资源
最近更新 更多