Оптимизация индексов: частая ошибка DBA

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,267
Реакции
1,543
Credits
32,326
Разберём распространённую ошибку, которую совершают многие администраторы баз данных — избыточные индексы.

Проблема

Добавление индексов — это полезно, но если их становится слишком много, то база данных начинает тормозить при вставке, обновлении и удалении данных. Почему? Потому что каждый индекс требует дополнительного обслуживания при изменениях в таблице.

Пример ошибки

Представим таблицу orders:
SQL:
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    customer_id INT NOT NULL,
    order_date DATE NOT NULL,
    total DECIMAL(10,2) NOT NULL
);
Допустим, мы добавляем индексы:
SQL:
CREATE INDEX idx_customer ON orders(customer_id);
CREATE INDEX idx_order_date ON orders(order_date);
CREATE INDEX idx_customer_order_date ON orders(customer_id, order_date);
На первый взгляд, всё логично, но есть проблема: индекс idx_customer_order_date покрывает оба предыдущих индекса!

Как исправить?
Можно удалить idx_customer и idx_order_date, так как составной индекс (idx_customer_order_date) способен выполнять их работу.

Как проверить ненужные индексы?
1️⃣ В PostgreSQL:
SQL:
SELECT indexrelid::regclass, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
ORDER BY pg_relation_size(indexrelid) DESC;
2️⃣ В MySQL:
SQL:
SHOW INDEX FROM orders;
Здесь ищем индексы, которые дублируют друг друга.

Вывод
Чем меньше избыточных индексов — тем быстрее работает ваша база данных. Проверьте свои индексы прямо сейчас!