Ваш запрос:
profils = profils.filter(us_last_name__icontains=name).using('crm')
Может не использовать индекс .
Действительно вы здесь стремиться выполнить поиск подстроки . Например, 'bar'
будет соответствовать, если столбец содержит 'foobarqux'
. Там нет индексов, которые поддерживают это. Например, дерево префиксов или дерево суффиксов могут соответствовать строкам, которые начинаются или заканчиваются данной строкой соответственно.
Для подстроки это не вариант. Можно определить некоторые сложные индексы, но они потребуют больших накладных расходов при вставке, обновлении и удалении элементов и потребуют относительно большой объем памяти по сравнению с фактически сохраненными данными. Поэтому не похоже, что база данных будет реализовывать их. Идеальный индекс обычно быстр при поиске и обновлений и часто занимает небольшой объем памяти по сравнению с реальной таблицей, поскольку в противном случае загрузка индекса заняла бы уже значительное количество времени.
Запрос, который может использовать индекс, таков:
profils = profils.filter(<b>us_last_name=name</b>).using('crm')
Но тогда, конечно, вы выполняете точное совпадение.
Это не имеет ничего общего с Django. Если вы попытаетесь в оболочке базы данных выполнить запрос, например:
SELECT * FROM crm_users WHERE <b>us_last_name LIKE '%bar%'</b>
, это займет примерно столько же времени.
В поисковых системах часто "подготавливают" данные в базы данных, собирая н-грамм [вики] , что позволяет затем быстро фильтровать на входе. Пакет вроде django-haystack
[readthedocs] может помочь с этим.