【发布时间】: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