Индекс


что такое Индекс?

Индекс представляет собой тип данных, отделить **от наших данных из таблицы. Ему нравится карта местоположений данных, указывающая на значение, расположенное на какой странице в куче **И идентификатор строки (для Postgres это tupleId). Куча — это таблица наших данных со своей страницей за другой.

(index value) => (Page, rowId)
(index value) => (Page, rowId)
Войти в полноэкранный режим

Выйти из полноэкранного режима


Страница

Сначала я думал, что когда мы делаем запрос на получение одной строки, он просто извлекает для нас эту единственную строку. На самом деле, это будет получить всю страницу который содержал нашу строку из кучи, затем собираем и возвращаем нужную строку. Для каждой страницы мы называем это вводом-выводом. Таким образом, производительность нашего запроса зависит от того, сколько страниц извлекает БД.


Кластерный индекс

Иногда мы можем слышать о Кластерный индекс. Когда мы определяем столбец как кластеризованный индекс, таблица теперь будет организовать вокруг этого ключа. Если в таблицу добавляется новая строка, она будет добавлена ​​в то место в куче, которое следует за порядком индекса. Например, у нас есть таблица пользователей ниже со столбцом идентификатора uuid, и приоритет_уровень является кластерным индексом. Хотя мы все видим ряды, упорядоченные Дантис > Ву > Нган > Джон, фактический порядок в куче таков: Дантис > Нган > Ву > Джон.

я быимяприоритет_уровень
КрутоЗуб10
zwqeВу5
тыдбТолько9
мнбвДжон4

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

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


Организация индексов (Postgres vs Mysql)

Для Postgres мы все еще можем это сделать, но на самом деле все эти индексы вторичные индексы. В отличие от других СУБД, все индексы будут указывать непосредственно на кучу. Итак, вы можете спросить, где находится первичный индекс, Postgres использует его для tupleid (ему нравится rowId) для управления данными.

Для MySQL мы можем создать оба первичный индекс а также вторичный индекстогда первичный индекс будет указывать на кучуа также вторичный индекс будет указывать на первичный.

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


Запрос

Поскольку Postgres указывает индекс непосредственно на кучу, БД просто нужно используйте сканирование индекса или другое сканирование кучи, чтобы получить нашу целевую строку. Тем временем Mysql выполнит 2 сканирования индекса для вторичного индекса и первичного индекса. Таким образом, Postgres может работать немного быстрее, чем Mysql.


Вставка

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


Обновление (удаление) Это самая интересная часть

При обновлении строки вместо изменения данных Postgres создать новую строку из исходных данных с изменениями и новым tupleId, то он указывает все индексы на эту новую строку. Вы можете спросить о старом tupleId (мертвый кортеж). Postgres использует это для отмены транзакции, но тогда, если мы забудем очистить эти мертвые кортежи, они зря потребуют большой ресурс. Вот почему нам нужен «вакуум» не для освобождения нашей памяти, а для ее повторного использования.

Для Mysql все гораздо проще. ему просто нужно обновить первичный и связанный индекс, если это необходимо.


Тип данных

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

Купи мне кофе ☕ купитькофе.

Я очень рад получить ваш отзыв об этой статье. Спасибо за ваше драгоценное время, прочитанное это.