Как это изменение влияет на скорость запроса к базе данных? - PullRequest
1 голос
/ 20 июля 2010

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

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

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

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

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

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

0 голосов
/ 20 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...