Когда индекс в базе данных может занимать больше места, чем сама таблица?

«Когда индекс в базе данных может занимать больше места, чем сама таблица?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Размер индекса может превышать размер таблицы в следующих ситуациях:

  • Широкие составные индексы. Индекс, включающий много колонок или колонки с большими типами данных (например, TEXT, VARCHAR(1000)), хранит копии этих значений.
  • Индексы по длинным строковым полям. Если таблица содержит мало строк, но каждая строка имеет большое текстовое поле, по которому построен индекс.
  • Особенности хранения в СУБД. Например, в PostgreSQL при использовании типов индексов, которые хранят полные копии данных (как COPY данных), или когда таблица сильно сжата, а индекс — нет.

Пример сценария:

-- Таблица с небольшим количеством записей, но длинным текстом
CREATE TABLE log_messages (
    id INT PRIMARY KEY,
    short_meta VARCHAR(50),
    long_message TEXT -- Очень длинный текст
);

-- Индекс по длинному текстовому полю может стать огромным
CREATE INDEX idx_message ON log_messages(long_message);

В этом случае индекс idx_message может легко превзойти по размеру таблицу log_messages, особенно если в ней всего несколько тысяч записей.