Какой тип индекса лучше использовать для поля типа VARCHAR в PostgreSQL?

«Какой тип индекса лучше использовать для поля типа VARCHAR в PostgreSQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для поля типа VARCHAR (или TEXT) в PostgreSQL в большинстве случаев оптимальным выбором является B-tree индекс.

Почему B-tree?

  • Эффективно поддерживает основные операции: равенство (=), сравнение (<, >), BETWEEN, IN.
  • Поддерживает сортировку (ORDER BY).
  • Может использоваться для поиска по префиксу с оператором LIKE 'pattern%'.

Пример создания стандартного индекса:

CREATE INDEX idx_users_email ON users(email);

Специальные случаи для строк:

  1. Поиск по шаблону (LIKE): Для запросов вида LIKE 'abc%' (но не LIKE '%abc') можно создать индекс с классом операторов varchar_pattern_ops или text_pattern_ops. Это улучшает производительность, так как сравнение выполняется по байтам, а не по локали.
    CREATE INDEX idx_users_name_pattern ON users (name varchar_pattern_ops);
  2. Полнотекстовый поиск: Для LIKE '%word%' или сложного текстового поиска используйте GIN/GiST индекс по полю типа tsvector, созданному из текста.
  3. Точное равенство: Если нужны только операции =, теоретически можно использовать Hash индекс, но на практике B-tree часто быстрее и универсальнее.