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.