【问题标题】:Django values_list extremely slow on large datasetDjango values_list 在大型数据集上非常慢
【发布时间】:2019-08-15 07:32:52
【问题描述】:

在大型数据集(6M+ 项)上,在 django 中获取 values_list 非常慢。

我有一个 Django 应用程序,其 DB 结构如下:

class Taxon(models.Model):
   name = models.TextField()

class Specimen(models.Model):
   taxon = models.ForeignKey("Taxon", related_name='specimens')

class Imaging(models.Model):
   taxon = models.ForeignKey("Specimen")
   image = models.ImageField(("Imaging"))

如果该分类单元的图像超过“100”张,则需要获取属于该分类单元的所有(图像、分类单元)的列表。

这在使用小型数据库的开发中运行良好:

image_list = list(Imaging.objects
.annotate(items_per_taxon=Count('specimen__taxon__specimens__images'))
                          .filter(items_per_taxon__gte=100)
                          .values_list('image', 'specimen__taxon'))

但在完整数据集(6M 分类单元行和 2M 图像行)上需要​​ 30 分钟。

有没有一种方法可以索引“外键的外键”或在 postgres 中创建一个虚拟列来加快速度?

【问题讨论】:

  • 应该在Imaging 上的taxon = models.ForeignKey("Specimen") 实际上是specimen = models.ForeignKey("Specimen")
  • 不,样本与“分类单元”相关联。例如,您的狗 Rolf 是一个样本。 Rolf 属于分类单元“狗”,您可以拍摄几张“rolf”(标本)的图像。所以'rolf'有一个属性'taxon'会返回'dog'

标签: python django postgresql


【解决方案1】:

如果您在注释前使用.values() 按样本分组以获取每个样本的所有图像的计数,您的注释可能会更有效。

image_list = list(
    Imaging.objects
    .values('specimen')
    .annotate(items_per_taxon=Count('*'))
    .filter(items_per_taxon__gte=100)
    .values_list('image', 'specimen__taxon')
)

由于您是新手,请务必使用答案旁边的复选标记将答案标记为正确,如果对您有帮助,请投票。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2012-12-18
    相关资源
    最近更新 更多