Ответ
В основном работал с PostgreSQL. Чаще всего создавал B-tree индексы для колонок, часто используемых в условиях WHERE, JOIN и ORDER BY, например, для полей user_id или created_at.
-- Индекс для ускорения фильтрации
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- Составной индекс с учётом порядка колонок (сначала более селективная)
CREATE INDEX idx_logs_created_at_user_id ON logs(created_at DESC, user_id);
Для полнотекстового поиска использовал GIN-индексы на поля типа tsvector.
CREATE INDEX idx_articles_content_gin ON articles USING gin(to_tsvector('russian', content));
Для работы с геоданными (например, поиск точек в радиусе) применял GiST-индексы.
CREATE INDEX idx_places_location_gist ON places USING gist(location);
При создании индексов всегда оценивал их влияние на производительность записи (INSERT/UPDATE/DELETE) и следил за их фактическим использованием через системное представление pg_stat_all_indexes, чтобы избежать накопления неиспользуемых индексов.
Ответ 18+ 🔞
А, индексы в постгресе? Ну, в основном, конечно, с ним и работал. Ты ж понимаешь, без них на больших объёмах — просто пиздец, всё встанет колом.
Чаще всего, само собой, лепил B-tree индексы. Это как классика жанра, когда нужно быстро найти что-то по WHERE, приджойнить или отсортировать. Ну, там, для user_id или created_at — самое то.
-- Индекс для ускорения фильтрации
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- Составной индекс с учётом порядка колонок (сначала более селективная)
CREATE INDEX idx_logs_created_at_user_id ON logs(created_at DESC, user_id);
Тут главное — не нагородить их овердохуища, а то они же тоже место жрут и на вставку/апдейт давят. Составные индексы — вообще хитрая жопа, нужно порядок колонок правильно подобрать, чтобы он реально работал.
А вот если нужно было по тексту искать, вот этот ваш полнотекстовый поиск — тут уже GIN-индексы в дело шли. Навешиваешь на поле, преобразованное в tsvector, и уже можно искать не только точные совпадения, а по смыслу, с морфологией.
CREATE INDEX idx_articles_content_gin ON articles USING gin(to_tsvector('russian', content));
Ну и, конечно, геоданные. Когда нужно найти все бары в радиусе километра от меня — без GiST-индекса на точку локации просто никуда. Иначе каждый запрос будет считать расстояния до каждой точки в таблице — это же ёперный театр, а не работа.
CREATE INDEX idx_places_location_gist ON places USING gist(location);
Но самое главное, чувак, — это не слепить индекс на каждую колонку, а потом охуеть от того, что база еле дышит. Я всегда смотрел, а пользуется ли он вообще, этот индекс-то? Для этого есть pg_stat_all_indexes. Запустишь — и сразу видно, какой индекс как паровоз работает, а какой — просто мёртвый груз, который только место занимает. И такие нужно безжалостно выпиливать, иначе они тебе всю производительность на запись похоронят. Волнение ебать, когда видишь кучу неиспользуемых индексов в продакшене — сразу терпения ноль.