按不同组查询 Django 模型并迭代这些子集查询的最有效方法
Most efficient way to query Django model by distinct groups and iterate over those subset queries
数据库是MySQL
我试图通过按 date_created
字段对它们进行分组并遍历每个查询来遍历模型中的所有字段。我已经能够这样做,但我的方法似乎效率低下。有没有更好,更清洁的方法?该数据库预计将达到 50,000 行以上,唯一日期长达一年或过去一年。我计划在 date_created
子查询的每个查询中进行复杂的工作,并且需要访问模型中的其他字段。我计划主要使用这些数据在使用 Django 和 Heroku 的网页上显示图表和内容。
data = model.objects.all()
distinct_dates = data.values('date_created').distinct()
for each_date in distinct_dates:
data.filter(date_created=each_date['date_created'])
each_date
的值将是与模型和该字段关联的每个唯一日期
这是我的模型
class Model(models.Model):
expansion = models.CharField(max_length=255, default='', db_index=True)
value = models.DecimalField(max_digits=12, decimal_places=2, default=0)
date_created = models.DateField(db_index=True)
class Meta:
ordering = ['date_created', ]
这个问题的答案取决于许多因素,其中一些因素如下:
- 您正在使用的数据库
- 数据库和您的应用程序之间的网络
- 数据行数
- 数据集中唯一日期的数量
- 之后您打算如何处理这些数据
- 申请详情
考虑以下用例:
- 如果您所做的只是获取数据而不对其进行任何操作,那么大多数时候一次获取所有数据会更快。
data = model.objects.all()
- 如果您打算只获取每个日期的聚合值,那么执行以下操作会更快:
data_by_dates = model.order_by('date_created').values(
'date_created'
).annotate(
count=Count('date_created'), total=Sum('amount')
)
- 如果您有数千个日期的数据,但每个日期只有几行数据,并且您按日期收集行,那么您也将连接到数据库一百万次。
- 如果您只有 7 天的数据,但在那个日期每秒有一个数据点,那么您将获得 86400 个数据点,但只连接到数据库 7 次
- 如果您有一年的数据,并且每秒有一个数据点,并且您决定一次收集所有这些数据,那么这将占用大量服务器内存。如果您计划在纯 python 中处理该数据,那么这也会耗尽您的 CPU。
我可以想出更多的用例,但除非你知道你实际想要做什么,并且你知道所涉及的上下文,否则很难说 "most efficient" 方法是什么.
数据库是MySQL
我试图通过按 date_created
字段对它们进行分组并遍历每个查询来遍历模型中的所有字段。我已经能够这样做,但我的方法似乎效率低下。有没有更好,更清洁的方法?该数据库预计将达到 50,000 行以上,唯一日期长达一年或过去一年。我计划在 date_created
子查询的每个查询中进行复杂的工作,并且需要访问模型中的其他字段。我计划主要使用这些数据在使用 Django 和 Heroku 的网页上显示图表和内容。
data = model.objects.all()
distinct_dates = data.values('date_created').distinct()
for each_date in distinct_dates:
data.filter(date_created=each_date['date_created'])
each_date
的值将是与模型和该字段关联的每个唯一日期
这是我的模型
class Model(models.Model):
expansion = models.CharField(max_length=255, default='', db_index=True)
value = models.DecimalField(max_digits=12, decimal_places=2, default=0)
date_created = models.DateField(db_index=True)
class Meta:
ordering = ['date_created', ]
这个问题的答案取决于许多因素,其中一些因素如下:
- 您正在使用的数据库
- 数据库和您的应用程序之间的网络
- 数据行数
- 数据集中唯一日期的数量
- 之后您打算如何处理这些数据
- 申请详情
考虑以下用例:
- 如果您所做的只是获取数据而不对其进行任何操作,那么大多数时候一次获取所有数据会更快。
data = model.objects.all()
- 如果您打算只获取每个日期的聚合值,那么执行以下操作会更快:
data_by_dates = model.order_by('date_created').values(
'date_created'
).annotate(
count=Count('date_created'), total=Sum('amount')
)
- 如果您有数千个日期的数据,但每个日期只有几行数据,并且您按日期收集行,那么您也将连接到数据库一百万次。
- 如果您只有 7 天的数据,但在那个日期每秒有一个数据点,那么您将获得 86400 个数据点,但只连接到数据库 7 次
- 如果您有一年的数据,并且每秒有一个数据点,并且您决定一次收集所有这些数据,那么这将占用大量服务器内存。如果您计划在纯 python 中处理该数据,那么这也会耗尽您的 CPU。
我可以想出更多的用例,但除非你知道你实际想要做什么,并且你知道所涉及的上下文,否则很难说 "most efficient" 方法是什么.