Что является основной единицей хранения информации в индексе базы данных?

Ответ

В контексте индексов баз данных базовой логической единицей хранения информации является страница (page) или блок (block).

  • Страница — это фиксированный по размеру блок данных (например, 8 КБ, 16 КБ), который является минимальной единицей ввода-вывода для движка базы данных. Индексные структуры, такие как B-дерево, организованы именно в виде страниц.
  • Каждая страница содержит множество записей индекса (index entries). Каждая запись обычно состоит из ключевого значения (или значений) и указателя на соответствующую строку данных (например, RID — Row Identifier).

Поэтому, когда говорят о размере индекса, часто имеют в виду количество занимаемых им страниц на диске.

Пример запроса для оценки размера индекса в PostgreSQL:

-- Показать размер индекса 'idx_user_email' в удобочитаемом формате
SELECT pg_size_pretty(pg_relation_size('idx_user_email')) AS index_size;

Этот запрос возвращает размер индекса в байтах, килобайтах, мегабайтах и т.д., что напрямую связано с количеством занятых страниц.

Ответ 18+ 🔞

А, слушай, вот тебе на самом деле важный момент, о котором многие вообще не задумываются, пока всё не накроется медным тазом. Когда ты говоришь про индексы в базе, то самая базовая штука, с которой всё работает — это страница (page), она же блок (block).

Представь себе, что твоя база данных — это библиотека, а страница — это одна полка. Нельзя принести или убрать одну книжку, ты всегда таскаешь целую полку, ёпта. Размер этой полки фиксированный — обычно 8 КБ, бывает 16 КБ. И движок базы, когда читает или пишет, работает именно такими кусками. Все эти умные структуры вроде B-дерева внутри себя состоят из таких вот страниц-полок.

На каждой такой странице живёт овердохуища записей индекса (index entries). Каждая запись — это, грубо говоря, связка: само значение, по которому ищешь (например, почта юзера), и указатель, где в куче данных лежит полная строка с этой почтой.

Так что когда какой-нибудь архитектор с умным видом говорит «размер индекса», он на самом деле имеет в виду, сколько таких вот страниц этот индекс сожрал на диске. А сожрать он может немало, особенно если наклепать индексов на всё подряд, не думая.

Вот, к примеру, в Постгресе можно одним запросом посмотреть, во что тебе вылился твой любимый индекс idx_user_email. Запрос простой, но полезный, как градусник:

-- Показать размер индекса 'idx_user_email' в удобочитаемом формате
SELECT pg_size_pretty(pg_relation_size('idx_user_email')) AS index_size;

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