我正在使用Django ORM在MySQL上进行非常简单的聚合,它生成了一个包含非常大的data
字段的GROUP BY
子句,导致查询速度减慢了100倍以上。
下面是一个简化版的模型:
class Document(models.Model):
data = models.TextField()
class Attachment(models.Model):
document = models.ForeignKey(Document)
我正在运行的查询语句:
Document.objects.annotate(num_attachments=Count('attachment'))
并且SQL输出结果为:
SELECT
`document_document`.`id`,
`document_document`.`data`,
COUNT(`document_attachment`.`id`) AS `num_attachments`
FROM `document_document`
LEFT OUTER JOIN `document_attachment`
ON (`document_document`.`id` = `document_attachment`.`document_id`)
GROUP BY
`document_document`.`id`,
`document_document`.`id`,
`document_document`.`data`
ORDER BY NULL
在数据字段上进行GROUP BY
是不必要和荒谬的。我可以通过执行values
查询来停止此操作:
Document.objects.values('pk').annotate(num_attachments=Count('attachment'))
但是,我要如何获得一个真正的带注释的文档查询结果?
name = models.CharField(max_length=24)
,得到了类似的结果,只不过它对所有三个字段进行了两次 GROUP BY!肯定是一个 bug。我正在使用版本 1.3.1,结果也是一样的。 - Furbeenator