【问题标题】:Django Models - SELECT DISTINCT(foo) FROM table is too slowDjango 模型 - SELECT DISTINCT(foo) FROM table 太慢了
【发布时间】:2016-01-26 08:49:24
【问题描述】:

我有一个 13M 行的 MySQL 表。我可以直接查询数据库

SELECT DISTINCT(refdate) FROM myTable

查询耗时 0.15 秒,非常棒。

定义为 Django 模型并查询为的等效表

myTable.objects.values(`refdate`).distinct()

需要很长时间。是不是因为distinct()之前的列表中的项目太多了。我该如何以一种不会让一切都崩溃的方式做到这一点?

【问题讨论】:

  • 您上面的代码生成的 SQL 将与您手动运行的几乎相同:SELECT DISTINCT mytable.refdate FROM mytable 所以它运行得这么慢很奇怪。您能否使用 django-debug-toolbar 进行分析以确保查询本身如此缓慢?
  • 我尝试使用 python shell 中的 django 模型并遇到上述问题。我什至从未尝试加载页面并看着它挂起。
  • 你能在 shell 中运行查询后转储connection.queries 吗? (from django.db import connection)?
  • @solarissmoke 谢谢!这帮助我填补了空白!

标签: python mysql sql django


【解决方案1】:

感谢@solarissmoke 提供指向connection.queries 的指针。

我期待看到

SELECT DISTINCT refdate FROM myTable

相反,我得到了

SELECT DISTINCT refdate, itemIndex, itemType FROM myTable ORDER BY itemIndex, refdate, itemType. 

然后我查看了models.py 中定义的 myTable。

unique_together = (('nodeIndex', 'refdate', 'nodeType'), )
ordering = ['nodeIndex', 'refdate', 'nodeType']

来自Interaction with default ordering or order_by

通常您不希望在结果中出现额外的列,因此请清除排序,或者至少确保它仅限于您在 values() 调用中也选择的那些字段。

所以我尝试order_by() 刷新之前定义的排序,瞧!

myTable.objects.values('refdate').order_by().distinct()

【讨论】:

    【解决方案2】:

    你可以试试这个:

    myTable.objects.all().distinct('refdate')
    

    【讨论】:

    • distinct() 仅支持 PostgreSQL。
    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2019-06-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多