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

Какую роль играют индексы в базе данных?

1.3 Junior🔥 211 комментариев
#Базы данных (SQL)

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

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

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

Роль индексов в базе данных

Индексы — это одна из наиболее важных структур данных в системах управления базами данных (СУБД). Они играют критическую роль в оптимизации производительности при выполнении запросов к базе данных. Правильное использование индексов может улучшить скорость чтения данных в несколько раз, но требует осторожности, так как имеет побочные эффекты.

Основная функция индексов

Индекс — это отдельная структура данных (обычно B-дерево или хеш-таблица), которая содержит отсортированные значения одного или нескольких столбцов таблицы вместе с указателями на соответствующие строки. Вместо полного сканирования таблицы (table scan), база данных может использовать индекс для быстрого поиска нужных данных.

# Пример: без индекса нужно проверить каждую строку
# SELECT * FROM users WHERE email = 'john@example.com'  -- O(n)

# С индексом на столбце email
# SELECT * FROM users WHERE email = 'john@example.com'  -- O(log n)

Виды индексов

Primary Key Index — уникальный индекс на первичный ключ. Гарантирует уникальность значений и обеспечивает быстрый доступ к строкам.

# SQL
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

Unique Index — обеспечивает уникальность значений в столбце без использования первичного ключа.

# SQL
CREATE UNIQUE INDEX idx_email ON users(email);

Full-Text Index — специализированный индекс для полнотекстового поиска в больших текстовых данных.

# SQL
CREATE FULLTEXT INDEX idx_content ON articles(content);
# Поиск
SELECT * FROM articles WHERE MATCH(content) AGAINST('python' IN BOOLEAN MODE);

Composite (Multi-column) Index — индекс на несколько столбцов одновременно. Полезен для запросов с несколькими условиями WHERE.

# SQL
CREATE INDEX idx_user_status ON users(department_id, status);
# Запрос, который будет использовать индекс
SELECT * FROM users WHERE department_id = 5 AND status = 'active';

Partial Index — индекс только для подмножества строк, удовлетворяющих определённому условию.

# SQL
CREATE INDEX idx_active_users ON users(email) WHERE is_active = true;

Когда использовать индексы

Используй индексы:

  • На столбцах, которые часто используются в условиях WHERE
  • На столбцах, используемых в JOIN условиях
  • На столбцах, используемых в ORDER BY и GROUP BY
  • На столбцах с низкой кардинальностью (много одинаковых значений)
  • На первичных и внешних ключах
# Хорошие кандидаты для индексирования
CREATE INDEX idx_user_id ON orders(user_id);
CREATE INDEX idx_created_at ON posts(created_at);
CREATE INDEX idx_category ON products(category_id);

Избегай индексов:

  • На столбцах, которые редко используются в запросах
  • На столбцах с очень низкой кардинальностью (например, bool поля)
  • На больших текстовых полях (используй полнотекстовый поиск)
  • На всех столбцах подряд (это замедлит INSERT, UPDATE, DELETE)

Преимущества индексов

  • Ускорение SELECT запросов — значительное ускорение чтения данных
  • Ускорение ORDER BY и GROUP BY — сортировка уже отсортированных данных
  • Ускорение JOIN операций — быстрый поиск связанных записей
  • Эффективность LIMIT — можно остановиться после нахождения N записей

Недостатки индексов

  • Замедление INSERT, UPDATE, DELETE — необходимо обновлять индекс при каждом изменении
  • Дополнительное место на диске — индексы требуют дополнительного хранилища
  • Усложнение поддержки — нужно отслеживать использование индексов
  • Фрагментация — индексы могут деградировать со временем

Практические примеры

# Пример на SQLAlchemy
from sqlalchemy import Column, Integer, String, Index

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    email = Column(String, unique=True, index=True)
    department_id = Column(Integer)
    status = Column(String)
    
    # Составной индекс
    __table_args__ = (
        Index('idx_dept_status', 'department_id', 'status'),
    )

Анализ индексов

Всегда анализируй выполнение запросов перед добавлением индексов:

# PostgreSQL
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';

# MySQL
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

Индексы — это мощный инструмент оптимизации, но их нужно использовать с умом, основываясь на анализе реальных запросов к базе данных.

Какую роль играют индексы в базе данных? | PrepBro