← Назад к вопросам
В каких случаях индекс весит больше чем сама таблица
3.0 Senior🔥 51 комментариев
#Базы данных и SQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Когда индекс тяжелее таблицы
Кейсы, когда индекс может быть больше самой таблицы
1. Covering Index (индекс покрывает запрос)
Если таблица содержит только primary key, а индекс содержит все колонки для запроса:
CREATE INDEX idx_user ON users(user_id, email, name, phone);
Индекс включает данные всех колонок, поэтому может занимать больше места, чем сама таблица с одним первичным ключом.
2. Много комбинированных индексов
Если таблица маленькая (100 строк), но на ней много индексов:
CREATE INDEX idx1 ON users(email);
CREATE INDEX idx2 ON users(name);
CREATE INDEX idx3 ON users(phone);
CREATE INDEX idx4 ON users(created_at);
Вместе все индексы могут весить больше, чем данные таблицы.
3. BLOB или TEXT колонки частично индексируются
CREATE FULLTEXT INDEX idx_description ON products(description);
Фуллтекстовый индекс может быть очень большим.
4. Таблица очень узкая, но много индексов
Таблица с несколькими INT и BIGINT колонками, но 10+ индексов.
Реальный пример из практики
В проекте была таблица с 50000 записей:
- Таблица: 5 MB
- Primary Key индекс: 0.5 MB
- 8 дополнительных индексов: 12 MB
- Итого индексов: 12.5 MB > 5 MB таблицы
Как это проверить
PostgreSQL:
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||.||tablename)) as size
FROM pg_tables
WHERE schemaname NOT IN (pg_catalog, information_schema)
ORDER BY pg_total_relation_size(schemaname||.||tablename) DESC;
MySQL:
SELECT
TABLE_NAME,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS size_mb
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = database_name;
Что с этим делать
- Удалять неиспользуемые индексы
- Использовать селективные индексы (
WHEREусловия) - Комбинировать колонки в составных индексах
- Регулярно анализировать индексы инструментами вроде
pg_stat_user_indexes