gpt4 book ai didi

python - django 聚合 SUM 是否被缓存?还是每次都计算?

转载 作者:行者123 更新时间:2023-11-30 22:06:04 24 4
gpt4 key购买 nike

假设我有一个事务模型:

class Transaction(models.Model):
receiver = models.CharField(unique=True)
value = models.DecimalField(max_digits=10, decimal_places=5)
date = models.DateField()

现在,我有数万笔交易进入表中。

我需要向接收者显示每天、每周、每月、每年等的交易。

我可以使用以下语句来做到这一点:

from django.db.models import Sum
transactions = Transaction.objects.filter(receiver="name").aggregate(Sum('value'))

然后根据我需要的日期段进行过滤。示例:

transactions.filter(date__gte=start_date, date__lte=end_date)

这有多快?如果表增长到拥有数百万个条目,会发生什么情况?我如何确保它已优化? django 是否缓存 Sum 中的值?

我天真的想法是创建更多模型来进行优化:DayTransaction、MonthTransaction、YearTransaction 等,当我更新 Transaction 模型时,我会更新所有其他模型。

这样,当用户请求数据时,我从“缓存”汇总数据的模型中获取数据,并且不必执行任何操作,它只需从相应的表中检索数据,这些数据很多比交易小。

这种方法的问题在于,它实际上可能不会更快,也不那么灵活,如果更新所有模型时出现任何问题,数据可能会变得困惑。

最佳答案

所以回答你的问题,是和否。查询集 (Transaction.objects.filter(...)) 在评估时确实会被缓存,但通常这不是问题。

您担心的是实际的聚合查询。首先,让我回答您的一般性问题,然后我将解释原因......

  1. 这有多快?
    • 非常快
  2. 如果表增长到拥有数百万个条目,会发生什么情况?
    • 没什么,只要为正确的列建立索引就可以了。
  3. 如何确保其得到优化?
    • 您不必这样做,Django 会为您做这件事(大部分情况下)。
  4. Django 是否缓存 Sum 中的值?
    • 是也不是。它缓存评估的查询集,但不缓存查询本身。

我们需要在这里解释一下大局。 Django 查询集翻译成 SQL。从字面上看,这个 SQL 是为了进行您想要进行的查询而构建的。 Transaction.objects.filter(...).aggregate(...) 的 SQL 看起来像这样

SELECT some_aggregate_func(*)
FROM myapp_transaction
WHERE [insert filters here];

您关于将数据分成多个表的想法实际上是一个非常糟糕的主意。它最终会减慢写入速度并使查询变得非常复杂。它还最终会给您带来管理重复数据的噩梦。请参阅link @matt-salzman 提供了有关处理大量数据的数据库的信息。

关于python - django 聚合 SUM 是否被缓存?还是每次都计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52835528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com