Django: проблема производительности запроса диапазона дат - PullRequest
0 голосов
/ 11 апреля 2011

В серверной части 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, я добавлю дополнительное поле года в модель, чтобы сохранить год и выполнить запрос в этом поле целого года.

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

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

1 Ответ

1 голос
/ 11 апреля 2011

вы пробовали range? похоже, что сгенерированный sql django равен вашему сыром 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';

...