Django: проблема производительности запроса диапазона дат

На сервере MySQL Django преобразует filter(date__year=2011) в ... WHERE date BETWEEN 2011-01-01 00:00:00 and 2011-12-31 23:59:59.99 в SQL, что занимает 3 секунды. Если я вручную удалю временную часть и запущу ее как ... WHERE date BETWEEN 2011-01-01 and 2011-12-31, время выполнения сократится на 1/100 до 30 мс.

Похоже, существует фундаментальная проблема с интерпретацией запросов диапазона дат. Любые идеи, чтобы обойти это?

Если я не могу найти способ использовать Django ORM, я добавлю в модель дополнительное поле года для хранения года и выполняю запрос для этого целочисленного поля года.

Спасибо за ваше время.

p.s: Из-за не зависящих от меня ограничений среда Django 1.1. Это может быть исправлено или лучше оптимизировано в новых версиях Django.


person onurmatik    schedule 11.04.2011    source источник
comment
Вы уже проиндексировали поле даты и времени?   -  person Nicola Cossu    schedule 11.04.2011
comment
да. в противном случае, я думаю, модифицированная вручную версия тоже заняла бы много времени. Благодарю.   -  person onurmatik    schedule 11.04.2011


Ответы (1)


пробовали ли вы range ? похоже, что сгенерированный django sql равен вашему необработанному sql. Работает с 1.1

.filter(date__range(datetime.date(2011,1,1), datetime.date(2011,12,31))

эквивалентно:

SELECT ... WHERE date BETWEEN '2011-01-01' and '2011-12-31';

person dting    schedule 11.04.2011
comment
Благодарю. ассортимент лучше. проблема заключалась в том, что я указывал начальное и конечное значения как объекты datetime.datetime вместо datetime.date. моя вина. - person onurmatik; 11.04.2011