Как оптимизировать поиск по нескольким столбцам для PostgreSQL - PullRequest
2 голосов
/ 31 марта 2019

У меня есть таблица в PostgreSQL, она имеет 20 столбцов, которые в основном имеют тип enum.И в этой таблице миллионы строк.

Я бы хотел поддерживать и ускорять запросы, ищущие строки с несколькими полями, например: col2=value1&col3=value2&col5=value3 page=1

Я не могу использовать составной индекс PostgreSQL, потому что он работает только сфиксированный порядок столбцов.Например, если я строю индекс на (col2,col3,col5), то он не может быть использован для запросов, ищущих col1=value1&col2=value2

. И я также хотел бы поддерживать такие запросы, как:

col1=value1&col2=(value3 or value4) orderby=col3 page=1

Каким было бы решение этой проблемы?И если мне не нужен полнотекстовый поиск по любому из этих столбцов (поскольку все они являются перечисляемыми типами), может ли решение быть легким?

1 Ответ

1 голос
/ 31 марта 2019

Если вы хотите, чтобы OR в вашем поисковом условии, это довольно просто & ldquo; game over & rdquo; для исполнения (немного преувеличиваю для эффекта).

Но если у вас есть только AND с и условия равенства, я хочу обратить ваше внимание на Фильтры Блума .

Вам просто нужно

CREATE EXTENSION bloom;

, а затем создайте индекс USING bloom для всех столбцов вместе.

В отличие от других индексов, этот единственный индекс может ускорять запросы со всеми возможными комбинациями столбцов в условии WHERE. Индекс - это просто фильтр, который пропускает некоторые ложные срабатывания, поэтому всегда требуется повторная проверка условия, но это значительно ускорит запрос.

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