64 lines
6.7 KiB
Markdown
64 lines
6.7 KiB
Markdown
---
|
||
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/) |