Django 聚合执行过多的 GROUP BY 子句
我正在 MySQL 上使用 Django ORM 进行非常简单的聚合,它生成一个包含 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'))
但是如何获得真实的带注释的文档查询作为结果呢?
I am doing a very simple aggregation using the Django ORM on MySQL, and it is producing a GROUP BY
clause that includes the data
field, which is very large, and is slowing down the query by over 100-fold.
Here is a simplified version of the model:
class Document(models.Model):
data = models.TextField()
class Attachment(models.Model):
document = models.ForeignKey(Document)
And the query I am running:
Document.objects.annotate(num_attachments=Count('attachment'))
And the SQL output:
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
Doing GROUP BY
on the data field is unnecessary and ridiculous. I can stop this by doing a values
query:
Document.objects.values('pk').annotate(num_attachments=Count('attachment'))
But then how do I get a real, annotated Document query as the result?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Django 核心提交者 Karen Tracy 已确认这实际上是 Django 中的一个错误:
http://groups.google.com/group/django-users/browse_thread/thread/22d4d46c8646b2c4#
Karen Tracy, a Django core committer, has confirmed that this is actually a bug in Django:
http://groups.google.com/group/django-users/browse_thread/thread/22d4d46c8646b2c4#
https://code.djangoproject.com/ticket/17144