← Назад к вопросам

Какие применял виды индексов в БД?

1.7 Middle🔥 151 комментариев
#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные виды индексов в БД

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

1. B-tree индексы (самые распространённые)

Это индексы по умолчанию в PostgreSQL и MySQL. Они идеальны для диапазонных запросов и сортировки.

from sqlalchemy import Column, Integer, String, Index
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    email = Column(String(255), nullable=False, index=True)
    created_at = Column(DateTime, nullable=False, index=True)

Использую для:

  • Поиска по точному значению: WHERE email = 'user@example.com'
  • Диапазонных запросов: WHERE created_at BETWEEN ... AND ...
  • Сортировки: ORDER BY email

2. Полнотекстовые индексы

Для поиска по тексту в PostgreSQL использую GIN или GiST индексы.

from sqlalchemy.dialects.postgresql import TSVECTOR
from sqlalchemy import func

class Article(Base):
    __tablename__ = 'articles'
    
    id = Column(Integer, primary_key=True)
    title = Column(String(255))
    content = Column(Text)
    search_vector = Column(TSVECTOR)

session.query(Article).filter(
    Article.search_vector.match('python')
).all()

3. Комбинированные индексы

Когда часто фильтрую по нескольким полям одновременно, использую составные индексы.

CREATE INDEX idx_orders_user_created ON orders(user_id, created_at DESC);

4. Уникальные индексы

Для обеспечения уникальности и ускорения поиска.

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String(100), unique=True)
    email = Column(String(255), unique=True)

5. Индексы на внешних ключах

Когда часто объединяю таблицы, индексирую внешние ключи.

class Comment(Base):
    __tablename__ = 'comments'
    id = Column(Integer, primary_key=True)
    post_id = Column(Integer, ForeignKey('posts.id'), index=True)
    user_id = Column(Integer, ForeignKey('users.id'), index=True)

6. Индексы на выражения

Для специальных случаев индексирую вычисляемое значение.

CREATE INDEX idx_users_lower_email ON users(LOWER(email));

Практические наблюдения

  • Анализировал EXPLAIN PLAN для медленных запросов
  • Проверял покрытие индексов (Index-Only Scan)
  • Избегал избытка индексов на часто обновляемых таблицах
  • Одна оптимизация ускорила список пользователей с 2 сек до 50мс благодаря правильному составному индексу

Самое важное - не создавать индексы наугад, а использовать EXPLAIN для обоснованного выбора.