2015-10-27 2 views
0

У меня есть таблица MySQL с 13M строками. Я могу запросить db непосредственно какМодели Django - SELECT DISTINCT (foo) Из таблицы слишком медленно

SELECT DISTINCT(refdate) FROM myTable 

Запрос занимает 0.15 секунды и отлично.

Эквивалентная таблица определена как модель Django и запрашиваются, как

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

занимает очень много времени. Это потому, что в списке слишком много элементов до distinct(). Как я могу сделать это так, чтобы все это не сбивало?

+0

SQL, порожденный код выше, будет в значительной степени то же самое, что вы запустить вручную: 'SELECT DISTINCT FROM mytable.refdate mytable' так странно, что она работает гораздо медленнее. можете ли вы профилировать с помощью django-debug-toolbar, чтобы убедиться, что это самый медленный запрос? – solarissmoke

+0

Я попытался использовать модель django из оболочки python и имел проблему, описанную выше. Я даже не пытался загрузить страницу и смотреть, как она висит. – Vishal

+1

Можете ли вы сбросить 'connection.queries' после запуска запроса в оболочке? ('from django.db import connection')? – 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. –

Смежные вопросы