postgres Как производительность запросов для отдельных слов столбцов - PullRequest
0 голосов
/ 18 февраля 2020

DB-Type: PostgreSQL DB-Version: 11 У нас есть столбец, который всегда содержит одно слово в качестве значения. Максимальная длина составляет 10 символов.

У нас всегда есть уникальное значение для этого столбца в таблице.

У нас нет обновлений для этого столбца, только новые строки вставляются с этим столбцом.

Мы хотели бы включить like запросов для этого столбца.

Следует ли нам рассмотреть расширение PostgreSQL TRGM и использовать индекс GIN? или в этом случае будет достаточно нормального индекса?

Запросы будут выглядеть так:

select * from my_table where my_column like '%abc%';

Вопрос возникает из-за того, что TRGM достаточно мощный, когда для полнотекстового поиска требуется длинный текст со многими словами, но хотелось бы знать, будет ли он лучше обычного индекса для сценария с одним словом.

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Индекс триграмм - это единственный индекс, который может помочь с запросом LIKE с лидирующим подстановочным знаком. Для коротких строк поиска, таких как показанная вами, она может все еще быть медленной, если триграмма встречается во многих словах. Но это лучшее, что вы можете получить.

Для условия LIKE без подстановочного знака в начале индекс b-дерева вполне может быть быстрее.

1 голос
/ 18 февраля 2020

«Обычный» индекс (b-дерево) обычно может разрешать:

where x like 'abcdefghij'
where x = 'abcdefghij'

Он также может использоваться для совпадений префиксов:

where x like 'abcd%'

Однако он не может использоваться, когда шаблон начинается с подстановочного знака:

where x like '%hij'

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

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

0 голосов
/ 19 февраля 2020

Я думаю, у вас есть фундаментальное (но довольно распространенное) недоразумение:

Вопрос возникает из-за того, что TRGM достаточно мощный, когда для длинного текста с большим количеством текста требуется полнотекстовый поиск слова

Нет, это то, для чего Полнотекстовый поиск , что сильно отличается от pg_trgm.

pg_trgm довольно плохо подходит для длинного текста со многими словами (не так плохо с 9.6, как это было до этого, но все же не самая сильная его сторона), но она хороша именно в том, что вы хотите.

Проблема в том, что для начала вам нужны триграммы. Если бы ваш запрос был изменен на like '%ab%', тогда pg_trgm, вероятно, был бы хуже, чем отсутствие индекса вообще. Поэтому может быть целесообразно проверить запрос на стороне приложения или клиента, чтобы отклонить попытки указать такие шаблоны.

...