onegreyonewhite
@onegreyonewhite

Как правильно сформулировать индексы?

Помогите сформулировать индексы, чтобы ускорить подзапрос вида (внутри Exists()):
SELECT 1
FROM "marketplace_product" U0
WHERE (U0."id" = АйДи из внешнего запроса AND
              (UPPER(U0."name"::text) LIKE UPPER('%подстрока%') OR
               UPPER(U0."short_description"::text) LIKE UPPER('%подстрока%') OR
               UPPER(U0."full_description"::text) LIKE UPPER('%подстрока%')))
LIMIT 1


Какие индексы тут могут помочь? Проблема в том, что запрос генерируется Django ORM и не совсем понятно как сделать подходящий индекс с помощью самого ORM.

Используется Django 4.2 и Postgres 13 (SQLite для тестов).
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
onegreyonewhite
@onegreyonewhite Автор вопроса
Методом подбора и внимательного исследования стаковерфлоу, получилось что-то вроде такого:
  1. Нужно в миграцию добавить
    django.contrib.postgres.operations.TrigramExtension()

  2. Нужно для каждого поля создать индекс (на примере name)
    django.contrib.postgres.indexes.GinIndex(django.contrib.postgres.indexes.GinIndex(django.contrib.postgres.indexes.OpClass(Upper('name'), name='gin_trgm_ops')))



Это капец как неочевидно, но для поиска по icontains работает именно так. Сорян, что потревожил сообщество.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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