Комментарии (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 для обоснованного выбора.