Здравствуйте, уважаемые подписчики и гости канала!
Индексы в базе данных PostgreSQL (впрочем как и в любой другой базе) представляют собой структуры, используемые для ускорения поиска и доступа к данным. Они играют важную роль в оптимизации производительности запросов SELECT, позволяя эффективно находить и извлекать и сортировать данные из таблицы. Индексы добавляются к таблицам и позволяют сократить время выполнения запросов, что особенно полезно в случае больших объемов данных.
Короче говоря, индексы способствуют улучшению отклика системы и обеспечивают более быстрый доступ к данным, что делает их неотъемлемой (!) частью проектирования баз данных.
В целом операции в индексами это стандартный DDL запросы. Нюансов много и мы поговорим о них дальше. В конце статьи обязательно посмотрите полезные ссылки.
В целом добавление индекса в postgresql выглядит примерно так:
CREATE INDEX product_case_product_id_active_idx ON product_case (product_id, active);
При создании индекса есть много дополнительных модификаторов и лучше всего смотреть их в официальной документации. Ну а я постараюсь в этой статье сжато рассказать про использование индексов как таковых - какие они бывают, в чем принципиальная разница, плюсы и минусы.
А так будет выглядеть удаление индекса:
drop index product_case_product_id_active_idx;
Типы индексов
Каждый тип индекса в PostgreSQL имеет свои особенности и применяется для оптимизации конкретных запросов и типов данных. Ниже рассмотрим когда какой типа индекса стоит применять.
B-дерево (B-Tree Indexes)
Наиболее распространенный тип индекса, подходит для большинства случаев. Обеспечивают эффективный поиск и сортировку данных, представляя собой структуру данных, основанную на бинарном дереве, которая позволяет быстро находить элементы в отсортированном порядке. Они широко используются для ускорения операций поиска и сортировки в базе данных PostgreSQL.
Хэш-индекс (Hash Indexes)
Подходит для поиска точных значений, но не поддерживает диапазонные запросы. Представляют структуру данных, которая использует хэш-функции для быстрого поиска данных. Они обеспечивают быстрый доступ к данным при поиске по точному значению. Однако они не поддерживают диапазонные запросы и не обеспечивают упорядоченный доступ к данным.
GiST (Generalized Search Tree)
Индексы такого типа обеспечивают возможность индексирования различных типов данных, таких как геометрические объекты, полнотекстовые данные и другие. Они позволяют эффективно выполнять запросы, связанные с многомерными данными и предоставляют гибкую структуру для поиска. Официальная документация называет их инфраструктурой для стратегий индексирования - почитайте сами, там много всего.
SP-GiST (Space-Partitioned Generalized Search Tree)
Как по мне очень специфичный индекс, лучше всего почитать официальную доку по нему. Я лишь скажу, что это про квадранты, k-мерные и префиксные деревья.
GIN (Generalized Inverted Index)
Подходит для полнотекстового поиска, индексации массивов и других сложных типов данных, например JSON.
BRIN (Block Range Index)
Предназначены для работы с большими объемами данных, такими как временные ряды или отсортированные данные. Они позволяют быстро и эффективно находить данные, основываясь на блоках диапазонов значений. Индексы BRIN могут быть особенно полезны для аналитических запросов и поиска по большим объемам данных.
Bloom
Тот самый фильтр Блума, позволяющий быстро проверить принадлежность элемента множеству. Компактный. Имеет право на false positive ошибку - может сказать, что элемент принадлежит множеству, но никогда не скажет, что элемента нет, если он есть во множестве. Лучше всего идти читать матчасть в первоисточниках:
Виды индексов
И тут вы скажете - но "есть же типы, какие еще виды?". Если честно, тут уже не знаешь как назвать. Типы выше - это методы хранения и поиска, а то, что я тут назвал "видами" это скорее про принципы индексации. Сейчас постараюсь уточнить.
Составные индексы
Создаются на комбинации нескольких столбцов, что позволяет ускорить выполнение запросов, использующих условия по нескольким столбцам одновременно.
Уникальные индексы
Обеспечивают уникальность значений в столбце или группе столбцов, что позволяет предотвратить вставку дублирующихся записей. Это обеспечивает целостность данных и упрощает поиск и обновление информации.
Функциональные индексы
Создаются на основе выражений или функций, что позволяет ускорить выполнение запросов, содержащих эти выражения
Покрывающие индексы
Включают в себя не только ключевые столбцы, но и другие столбцы, необходимые для выполнения запроса. Они улучшают производительность, поскольку позволяют выполнить запрос, не обращаясь к самим данным в большой таблице, а только к индексам, что снижает нагрузку на базу данных.
Частичные индексы
Создаются на основе подмножества данных, что позволяет ускорить выполнение запросов, ограниченных определенными условиями. Улучшают производительность запросов, соответствующих условиям, на которые они ограничены.
Эти виды индексов предоставляют дополнительные возможности для оптимизации производительности запросов в PostgreSQL, но (как обычно) требуют внимательного подхода к их использованию и обслуживанию.
Заключение
Уфф. Выше довольно много инфы, поэтому давайте оглянемся назад и подведет итоги.
Плюсы
В целом в введении все написано, но повторение - мать учения. Индексы помогают:
- Ускорить выполнение запросов SELECT (поиск и сортировка данных)
- Дают возможность улучшения отклика системы и оптимизации запросов (врем выполнения и нагрузка на диск). И все это без переписывания самих запросов
🚀 Кстати, если хочется окунуться в тему оптимизации запросов, то у меня есть видео на эту тему. Переходи, смотри, ставь лайк - https://dzen.ru/video/watch/63d988b45bf4a65fa896bd93
🚀 А вот ссылочка на подборку всех видео по PG - https://dzen.ru/suite/37b67ffa-176d-493a-b1a8-4762f79e3753
Минусы и нюансы
Не пренебрегайте этим списком - индексы не бесплатное удовольствие и об этом стоит помнить.
- Некорректное использование индексов может привести к ухудшению производительности
- Выбор типа и вида индекса зависит от конкретной ситуации, типа данных и типа запросов
- Ресурсы сервера на пересчет и обновление индексов
- Создание и поддержание индексов может замедлить процессы вставки, обновления и удаления данных
- Индексы требуют дополнительного места на диске
Полезные ссылки
---
А на этом всё, спасибо за внимание!
Подписывайтесь на канал, ставьте лайки, оставляйте комментарии - это помогает продвижению в Дзене.
Кроме этого:
Подписывайтесь в Telegram: https://t.me/lets_goto_it