Как это изменяется, влияют на скорость этого запроса базы данных?

Сначала я использовал этот запрос:

Model.object.get(name='something', date=somedatavariable)

Но затем я должен был расширить свой запрос и изменить его на это:

Model.objects.get(name__icontains="something", date__range(start_date,end_date))

Внезапно моя база данных берет в 5 раз дольше, чем с исходным запросом. Что продолжается здесь, и как я могу сделать его быстрее?

1
задан Benjamin 6 January 2014 в 16:53
поделиться

2 ответа

Поиск с учетом регистра (name__icontains='something') будет ОЧЕНЬ дорогим запросом к БД, чем поиск с учетом регистра (name='something'). 5 раз медленнее не звучит необоснованно, и это сильно зависит от любого из следующих факторов:

  • Движок базы данных (MySQL, PostgreSQL, SQLite и т.д.)
  • Количество записей в базе данных
  • Объем текста в каждом поле имени, который приходится перебирать
  • Есть ли соответствующий индекс, который БД может использовать для этого столбца

Последнее очень сложно. Сделать полнотекстовый индекс для базы данных очень сложно, очень легко ошибиться, и даже не все движки баз данных поддерживают его.

То же самое касается date против date__range: вы используете быстрое, простое, легкое для индексации точное соответствие в одном случае, и неточное соответствие в другом.

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

2
ответ дан 2 September 2019 в 22:54
поделиться

Сомневаюсь, что кто-нибудь сможет догадаться, как именно вела себя ваша база данных :-) Но вы можете использовать это промежуточное ПО:

http://djangosnippets.org/snippets/161/

и проверить, что это за sql были сделаны запросы и сколько времени они заняли.

0
ответ дан 2 September 2019 в 22:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: