Краткий обзор мощной концепции

База данных отличается организованным хранением данных. Хранилище имеет особую структуру, в которой размещаются данные. Каждый тип базы данных имеет свой формат для хранения данных. Они настроены и оптимизированы для конкретных случаев использования. В приведенном ниже примере у нас есть база данных с информацией об автомобилях:

Это выглядит красиво, и по нему легко ориентироваться. Но вы когда-нибудь спрашивали себя, как на самом деле хранятся данные?

Внутреннее хранилище

Каждая база данных внутренне хранится в файле с определенной кодировкой и форматированием. Для простоты представим, что база данных поддерживается файлом CSV. Вот как это выглядит:

ID,Brand,Model,Color,Price
1,Ford,Focus,Grey,42000
2,Toyota,Prius,White,40500
3,BMW,M5,Red,60000
4,Audi,A3,Black,38000
5,Toyota,Camry,White,51500
6,VW,Golf,Grey,32000

Все кажется простым. Выполнить поиск только с шестью записями - не проблема. Но можете ли вы представить, если бы у вас было 100 000 записей? Просмотр файла стал бы очень медленным. Время запроса увеличивается пропорционально размеру файла. Когда мы знаем, что база данных со временем будет расти, нам нужно найти решение.

На помощь приходит индексация.

Индекс базы данных

Индекс базы данных - это структура данных, которая используется для ускорения операций по извлечению данных. На что это похоже?

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

Самый простой способ добиться этого - сохранить смещение для каждой записи в хеше. Ключ - это значение столбца, который мы хотим проиндексировать (в этом примере это столбец ID). Хеш-значение - это смещение в файле базы данных. Для ID = 1 смещение равно 0. Для ID = 2 смещение равно 24. Это может выглядеть так:

Hash Index {1:0, 2:24, 3:51, 4:70, 5:92, 6:118}

1 => {0}         --------->   1,Ford,Focus,Grey,42000   
2 => {24}        --------->   2,Toyota,Prius,White,40500
3 => {51}        --------->   3,BMW,M5,Red,60000
4 => {70}        --------->   4,Audi,A3,Black,38000
5 => {92}        --------->   5,Toyota,Camry,White,51500
6 => {118}       --------->   6,VW,Golf,Grey,32000

После добавления индекса запрос автомобилей по идентификатору быстрее вернет результаты. Запрос на извлечение переходит в хэш-индекс и принимает смещение для соответствующего идентификатора. Затем он начинает чтение файла базы данных со смещения точно с нужной записи.

Индексирование - это правильный способ реализовать ограничение уникальности. Если вы хотите гарантировать, что значение в определенном столбце уникально, тогда необходим индекс этого столбца. В противном случае каждая операция вставки будет зависать, проверяя, существуют ли уже новые данные.

Также возможно иметь несколько индексов. Если нам нужен быстрый запрос по любому другому столбцу, мы также добавляем по нему индекс. Например, мы могли бы добавить индекс по цвету и запрашивать быстрые автомобили по цвету. Но каждый новый индекс влечет за собой дополнительные затраты на базу данных.

Индекс затрат

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

Во-вторых, для операций быстрого чтения будут несколько более медленные операции записи. Каждый раз, когда мы добавляем запись в таблицу, мы также должны создавать элемент в хеш-индексе. Аналогичная ситуация относится к обновлению или удалению данных. Это компромисс, с которым мы должны иметь дело.

Выводы

  • Индекс базы данных - хороший способ повысить количество запросов на чтение.
  • Индексирование столбца необходимо для ограничения уникальности.
  • С каждым новым индексом будет потребляться больше памяти.
  • Добавление индекса влияет на операции записи и обновления.

Так работает простой хеш-индекс. Есть много других подходов к использованию индексов базы данных, таких как таблицы сортированных строк или B-деревья. Они используют более сложную логику и оптимизированные структуры для достижения лучших результатов.

Однако идея сохранения смещения осталась прежней. При правильном использовании индексов вы сможете выйти на новый уровень в работе с базами данных.