# Operator classes и выбор индекса _Индексы · PostgreSQL Knowledge Base_ **TL;DR:** Индекс работает не «на колонке», а для конкретных операторов над ней. Связь тип+оператор+метод доступа задаёт operator class. Через каталог pg_amop можно узнать, какой AM поддерживает оператор: @> знают gin и gist, не btree. ## Индекс - для операторов B-tree на `flight_id` отвечает на `= 7`, `> 40`, `BETWEEN`, но не на `flight_id % 2 = 0` - такого оператора в его operator class нет. Какой AM знает какой оператор - решает operator class, объект каталога. ## Карта каталогов | Каталог | Что | |---|---| | `pg_am` | методы доступа: btree, hash, gist, gin, spgist, brin | | `pg_opclass` | operator class: тип + AM + операторы | | `pg_opfamily` | семейство связанных opclass | | `pg_amop` | операторы семейства и их стратегии | Узнать, какой AM поддерживает оператор: ```sql SELECT DISTINCT am.amname FROM pg_amop aop JOIN pg_operator op ON op.oid = aop.amopopr JOIN pg_opfamily f ON f.oid = aop.amopfamily JOIN pg_am am ON am.oid = f.opfmethod WHERE op.oprname = '@>'; -- gin, gist (не btree) ``` ## Несколько opclass на тип ```sql CREATE INDEX ON t (email text_pattern_ops); -- под LIKE 'prefix%' ``` Обычный текстовый opclass сравнивает по локали, и `LIKE 'abc%'` им не ускоряется; `text_pattern_ops` сравнивает побайтово - и префиксный LIKE работает. ## Поддержка ≠ использование Даже если оператор поддержан, индекс не сработает, когда колонка под функцией - условие не sargable (см. [sargability](/courses/postgres/kb/sargability.md)). Выбор типа индекса смотри в [index-design](/courses/postgres/kb/index-design.md), устройство B-tree - в [btree-structure](/courses/postgres/kb/btree-structure.md). ## Команды ```sql SELECT amname FROM pg_am; ``` Список методов доступа ```sql CREATE INDEX ON t (col text_pattern_ops); ``` Индекс под LIKE 'prefix%' (побайтовое сравнение) ## См. также - [B-tree: структура и спуск](/courses/postgres/kb/btree-structure.md) - [Sargability: почему индекс не используется](/courses/postgres/kb/sargability.md) - [Проектирование индексов](/courses/postgres/kb/index-design.md)