digital-garden/source/курсы/otus/Архитектор высоких нагрузок 2019/Лекция. Индексы.md
2024-06-13 21:01:37 +03:00

64 lines
6.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2024-01-29
parents:
- "[[Архитектор высоких нагрузок - OTUS 2019]]"
zero-link:
- "[[00 Базы Данных]]"
---
Индексы позволяют ускорить запросы к БД. Также через них можно делать constraints (UNIQUE, FOREIGN KEY).
Индекс
- служебная структура данных
- ускоряет поиск, сортировку
- требуют дополнительное место для хранения
- обновляются при модификации данных
Какие запросы оптимизируют?
- Поиск данных
- Сортировка
- Избежание чтения из таблицы (покрывающие индексы, covering indexes)
- Специальные оптимизации
Какие бывают индексы?
- не уникальные и уникальные. Уникальные без повторяющихся значений.
- простые и составные. Составные из нескольких полей.
- кластерные и некластерные. Кластерные также хранят сами данные рядом с собой.
Как выбирается индекс?
- План выбирается динамически
- Прикидка по случайному спуску
- Используется таблица статистик
В составных индексах важен порядок столбцов. Порядок полей в индексе должен учитывать селективность каждого поля, то есть насколько уникальными являются значения в столбце. В идеале более селективные поля должны идти первыми в индексе, чтобы максимизировать эффективность индекса.
При поиске по составному индексу, сначала сравнивается первый элемент указанный в индексе, потом второй и так далее. Поэтому запросы, которые не следуют этому порядку колонок являются не оптимальными.
Частичное использование индекса. Используется до первого неравенства.
- a > 0 and b = 4. Индекс будет использоваться для всех колонок
- a = 0 and b > 3 and c = 3. Индекс будет использоваться для первых двух колонок,
- a = 0 and b > 3 and c > 3. Индекс будет использоваться только для первой колонки.
Покрывающий индекс - это индекс, который включает в себя все колонки, необходимые для выполнения определенного запроса, без необходимости обращения к основной таблице данных. Это означает, что СуБД может обработать запрос, используя только данные, хранящиеся в индексе, что значительно улучшает производительность, поскольку избегается дополнительное обращение к таблице.
Из агрегирующих функций только min и max получат ускорение при использовании индекса.
Индексы хорошо работают с логическим И, и плохо работают с логическим ИЛИ.
```sql
SELECT * FROM tb WHERE a = 0 OR b = 0;
```
Можно использовать 2 индекса (а) и (b). Индекс (а, b) работать не будет.
***
Селективность — это мера того, насколько хорошо индекс помогает уменьшить количество строк, которые необходимо проверить при выполнении запроса. Другими словами, селективность показывает, какая доля общего количества строк в таблице будет отфильтрована при использовании конкретного индекса для выполнения запроса.
Селективность выражается как значение от 0 до 1, где 0 означает, что индекс не помогает отфильтровать ни одну строку (то есть, придется просмотреть все строки), а 1 означает, что индекс позволяет выбрать только одну строку из всего набора данных, что является идеальным сценарием.
Высокая селективность индекса означает, что запросы, использующие этот индекс, будут более эффективными, поскольку они смогут исключить большое количество нерелевантных строк без необходимости их полного сканирования. С другой стороны, индекс с низкой селективностью может оказаться неэффективным, так как большая часть данных все равно потребует проверки.
Однако эту особенность можно использовать себе во благо. Например, когда необходимо находить редкие данные в куче однотипных данных. Например, мы используем флаг, чтобы отмечать обработанные записи, большая часть записей будет обработана, а нам необходимо находить записи, которые еще не обработаны, то есть у них флаг не установлен.
***
## Дополнительные материалы
- [009. B-деревья. Система непересекающихся множеств - М. А. Бабенко - YouTube](https://www.youtube.com/watch?v=KFcpDTpoixo)
- [Индексы в PostgreSQL — 1 / Хабр](https://habr.com/ru/companies/postgrespro/articles/326096/)
- [Introduction of B+ Tree - GeeksforGeeks](https://www.geeksforgeeks.org/introduction-of-b-tree/)