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

SELECT DISTINCT(refdate) FROM myTable


查询耗时0.15秒,非常棒。

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

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


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

最佳答案

感谢@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()

10-07 14:28