> For the complete documentation index, see [llms.txt](https://sallyit.gitbook.io/akademiait/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sallyit.gitbook.io/akademiait/hard-skills/bazy-dannykh/optimizaciya-bd.md).

# Оптимизация БД

### Оптимизация БД

Добавь базе скорость

### Индексы в таблицах <a href="#indeksy-v-tablicakh" id="indeksy-v-tablicakh"></a>

**Индексирование баз данных** — это техника, повышающая скорость и эффективность запросов к базе данных. Она создаёт отдельную структуру данных, сопоставляющую значения в одном или нескольких столбцах таблицы с соответствующими местоположениями на физическом накопителе, что позволяет базе данных быстро находить строки по конкретному запросу без необходимости сканирования всей таблицы.

Применяются разные типы индексов, однако они занимают пространство и должны обновляться при изменении данных. Важно тщательно продумывать стратегию индексирования базы данных и регулярно её оптимизировать.

#### Алгоритмы индексирования <a href="#algoritmy-indeksirovaniya" id="algoritmy-indeksirovaniya"></a>

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

* B-дерево
* Bitmap-индекс
* Хэш-индекс
* GiST (Generalized Search Tree, обобщённое поисковое дерево)
* Полнотекстовый индекс

Рассмотрим самый простой и распростаненный способ индексирования - В-дерево.

### B-дерево <a href="#b-derevo" id="b-derevo"></a>

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

Поиск начинается с корневого узла. Наша задача — пройти по каждому элементу в узле и сравнить его значение с искомым:

* Если значение совпало — берём ссылку на данные и читаем их из таблицы.
* Если наше значение больше, чем значение в элементе, — идём дальше.
* Если искомое значение меньше, чем в элементе, — нам нужно перейти в поддерево, которое хранится левее от ячейки. Далее мы попадаем на следующий уровень и итерация повторяется.

Рассмотрим алгоритм на примере поиска значения 2001.

* Как и говорилось ранее, мы начинаем с корневого узла — первой ячейки со значением 1000.
* Так как 2001 больше 1000, то мы идём дальше.
* Доходим до ячейки 3000. Но 2001 меньше, чем 3000, поэтому переходим на поддерево.
* Первая ячейка идёт со значением 2200, наше значение меньше, значит снова переходим на левое поддерево.
* И сразу же находим ячейку со значением 2001.

То, что мы и искали. А так как искомая ячейка содержит ссылку на место, где лежат наши данные, то мы можем легко и быстро прочитать их.

Источники:

[PreviousМасштабирование БД](broken://pages/7qwuDmmQgGNBctA4COd7)[NextТипы индексов](https://3558955033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbZKWe747D7DUg6CC8XPy%2Fuploads%2FQdL8jsA9Djr9pXcj1TS6%2Ftipy%20indeksov?alt=media)

Last updated 6 months ago
