Пейджер

print("Hello, World! 🌟")

print("Hello, World! 🌟")

Впереди выходные, но давайте не будем спешить отдыхать. Вот небольшая порция полезной информации для вас! Сегодня обсудим важную тему, очень часто задаваемую на собеседованиях. Итак, встречайте, индексы баз данных! 📊

Хотя тема кажется простой, на самом деле она довольно обширная. Я вкратце расскажу о ней, чтобы вы могли самостоятельно изучить вопрос более глубоко. Информация будет ориентирована на PostgreSQL, но будет полезна и для других СУБД.

💡 Зачем нужны индексы?

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

- B-tree
- Hash
- GiST
- SP-GiST
- GIN
- BRIN

Не буду останавливаться на каждом, могу сказать, что B-tree (Balanced Tree) — это тип по умолчанию и подходит для всех типов данных, если только вы не имеете дело с очень специфичной информацией в своей базе данных.

🔑 Когда добавлять индексы?

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

📝 Индексы стоит добавлять, когда:

- Осуществляется поиск по столбцу, например, WHERE last_name = '...'.
- Необходима валидация на уровне базы данных. Иногда недостаточно иметь валидацию на бэкэнде или фронтенде, считается хорошей практикой использовать индекс для целостности данных.
- Столбцы участвуют в операциях JOIN.
- Часто используется сортировка по столбцу.

🛠️ Основные способы создания индексов:

1. Базовый индекс:
   CREATE INDEX users_first_last_idx ON users (first_name, last_name);


2. Частичный индекс:
Когда создается индекс, по умолчанию он записывает все записи в таблице, чтобы этого избежать, можно использовать данный индекс:
   CREATE INDEX last_name_idx 
                  ON users (last_name) WHERE deleted_at IS NULL;


3. Индекс по выражениям:
   CREATE INDEX idx_contacts_full_name 
                   ON contacts ((first_name ' ' last_name));

К примеру для быстрого поиска пользователей по полному имени:
   SELECT * FROM users WHERE (first_name  ' '  last_name) = 'Илья Иванчиков';

Учтите, что такой индекс требует больше дискового пространства.

4. Покрывающий индекс:
   CREATE INDEX idx_users_covering 
                   ON users (customer_id) INCLUDE (first_name, last_name);

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

📏 Итого: несколько правил хорошего тона при работе с индексами:

- Не индексируйте все столбцы.
- Не индексируйте столбцы в маленьких таблицах.
- Выбирайте правильный тип индекса; индекс B-tree (по умолчанию) хорош во многих случаях, но не во всех.
- Поддерживайте индексы; со временем некоторые могут стать ненужными или данные необходимо переиндексировать.
- Проводите бенчмаркинг и тестирование на данных, близких к production.
- И используйте индексы! 😉


### Поделитесь своим мнением! 💬
Если вам понравилась статья, не забудьте поставить лайк и оставить комментарий👇! И в следующий раз, когда будет тема про базы данных, расскажу, как работает индекс B-tree.

#DATABASE #PostgreSQL
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram