2015-10-27 49 views
0

我有一个有13M行的MySQL表。我可以直接查询数据库作为Django Models - SELECT DISTINCT(foo)FROM表太慢

SELECT DISTINCT(refdate) FROM myTable 

的查询需要0.15秒和是伟大的。

定义为一个Django模型和询问作为

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

的等效表需要很长的时间。是否因为distinct()之前列表中的项目太多。我该如何做到这一点,而不是把所有事情都拖下水?

+0

您的代码生成以上将是几乎相同的,你手动运行什么SQL:'SELECT DISTINCT mytable.refdate FROM mytable'所以它的怪异,它运行这么慢得多。你可以使用django-debug-toolbar进行配置文件来确保查询本身非常慢吗? – solarissmoke

+0

我曾尝试使用python shell中的django模型,并且遇到了上述问题。我甚至从来没有尝试加载一个页面,并观看它挂起。 – Vishal

+1

在shell中运行查询后可以转储'connection.queries'吗? ('从django.db导入连接')? – solarissmoke

回答

1

谢谢@solarissmoke为指针connection.queries

我期待看到

SELECT DISTINCT refdate FROM myTable 

相反,我得到了

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

我再看着myTable的在models.py定义。

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() 
0

你可以试试这个:

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

带位置参数的'distinct()'仅在PostgreSQL上受支持。 –