Сначала я использовал этот запрос:
Model.object.get(name='something', date=somedatavariable)
Но затем я должен был расширить свой запрос и изменить его на это:
Model.objects.get(name__icontains="something", date__range(start_date,end_date))
Внезапно моя база данных берет в 5 раз дольше, чем с исходным запросом. Что продолжается здесь, и как я могу сделать его быстрее?
Поиск с учетом регистра (name__icontains='something'
) будет ОЧЕНЬ дорогим запросом к БД, чем поиск с учетом регистра (name='something'
). 5 раз медленнее не звучит необоснованно, и это сильно зависит от любого из следующих факторов:
Последнее очень сложно. Сделать полнотекстовый индекс для базы данных очень сложно, очень легко ошибиться, и даже не все движки баз данных поддерживают его.
То же самое касается date
против date__range
: вы используете быстрое, простое, легкое для индексации точное соответствие в одном случае, и неточное соответствие в другом.
Итог: если вам не нужны неточные совпадения, то не используйте их. Это дорогостоящие операции с БД, и они будут выполняться значительно дольше.
Сомневаюсь, что кто-нибудь сможет догадаться, как именно вела себя ваша база данных :-) Но вы можете использовать это промежуточное ПО:
http://djangosnippets.org/snippets/161/
и проверить, что это за sql были сделаны запросы и сколько времени они заняли.