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

Что такое индексы в базе данных и какие их преимущества и недостатки?

2.2 Middle🔥 171 комментариев
#SQL и базы данных

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

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

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

Что такое индексы в базе данных и какие их преимущества и недостатки?

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

Как работает индекс:

Индекс хранит отсортированные значения столбца с указателями на соответствующие строки таблицы. Обычно используется структура данных B-tree (сбалансированное дерево), которая обеспечивает быстрый поиск за O(log n) вместо O(n) при полном сканировании таблицы.

Типы индексов:

1. Простой (Single Column) индекс:

CREATE INDEX idx_customer_email ON customers(email);

2. Составной (Composite) индекс:

CREATE INDEX idx_order_date_customer 
  ON orders(order_date, customer_id);

3. Уникальный индекс (Unique Index):

CREATE UNIQUE INDEX idx_unique_email 
  ON customers(email);

4. Полнотекстовый индекс (Full-Text Index):

CREATE FULLTEXT INDEX idx_product_description 
  ON products(description);

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

1. Ускорение поиска

Поиск по индексированному столбцу выполняется за логарифмическое время вместо линейного:

SELECT * FROM customers WHERE email = 'john@example.com';
-- Без индекса: сканирование всей таблицы O(n)
-- С индексом: быстрый поиск O(log n)

2. Оптимизация сортировки и группировки

Индексы ускоряют операции ORDER BY и GROUP BY:

SELECT customer_id, COUNT(*) 
FROM orders
GROUP BY customer_id;  -- Индекс на customer_id ускорит

3. Ускорение JOIN операций

Индексы на ключах соединения значительно улучшают производительность:

SELECT o.*, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;
-- Индекс на customer_id в обеих таблицах критичен

4. Поддержка уникальности данных

Уникальный индекс гарантирует отсутствие дубликатов и работает быстрее, чем проверка отдельным запросом.

5. Оптимизация WHERE условий

Сложные условия выполняются быстрее с индексами:

SELECT * FROM orders 
WHERE status = 'completed' AND order_date >= '2024-01-01';
-- Составной индекс (status, order_date) сильно ускорит

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

1. Увеличение размера базы данных

Каждый индекс занимает дополнительное дисковое пространство:

SELECT schemaname, tablename, indexname, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_indexes
JOIN pg_class ON pg_indexes.indexname = pg_class.relname;

На большие таблицы индексы могут занимать значительное место.

2. Замедление операций записи (INSERT, UPDATE, DELETE)

При добавлении, обновлении или удалении строки нужно обновить все индексы:

INSERT INTO customers(id, email, name, phone) VALUES (...);
-- Нужно обновить индексы на email, phone и другие

Это может замедлить операции на 10-30% в зависимости от количества индексов.

3. Затраты на поддержание индексов

СИБД должна поддерживать индексы в отсортированном состоянии, что требует ресурсов при каждом изменении данных.

4. Сложность выбора индексов

Неправильный выбор индексов может даже замедлить запросы:

-- Индекс на редко используемый столбец — впустую потраченная память
CREATE INDEX idx_rarely_used ON products(unused_column);

5. Фрагментация индексов

С течением времени индексы могут фрагментироваться и требовать перестроения:

-- Оптимизация индексов в PostgreSQL
REINDEX TABLE customers;

Лучшие практики при использовании индексов:

1. Индексируй колонки, которые часто используются в WHERE:

CREATE INDEX idx_status ON orders(status);

2. Используй составные индексы для сложных условий:

CREATE INDEX idx_order_filter 
  ON orders(status, order_date DESC);

3. Не создавай индексы на выражениях без необходимости:

-- Хорошо для range queries
CREATE INDEX idx_date ON orders(order_date);

-- Может быть медленнее
CREATE INDEX idx_date_expr ON orders(DATE(order_date));

4. Проверяй использование индексов:

-- В PostgreSQL
EXPLAIN ANALYZE SELECT * FROM customers WHERE email = 'john@example.com';

5. Удаляй неиспользуемые индексы:

DROP INDEX idx_old_unused;

Баланс между поиском и записью:

Для аналитических систем (OLAP) — индексы критичны, так как доминируют операции чтения. Для транзакционных систем (OLTP) с частыми изменениями — нужно осторожнее с индексами.

Правильное использование индексов — один из главных навыков для оптимизации производительности базы данных.

Что такое индексы в базе данных и какие их преимущества и недостатки? | PrepBro