Should we use Single Index in case we use Composite index?
От: Aleksei_Lekomtsev  
Дата: 24.10.23 09:46
Оценка:
Например, есть колонки — column1, column2, column3
Создали один индекс на все три
Следует ли еще отдельно создавать индекс на column1, column2, column3? Т.е. в итоге иметь 4 индекса?

Если я правильно понял, индекс на column1 отдельно создавать не нужно, так как в случае select c where clause/join with column1 будет использоваться композитный индекс(так как это определеяется порядком колонок на которые создали композитный индекс),
а в случае select c where clause/join with column2, column3 композитный индекс уже использовать не получится. Т.е нужно создавать 3 индекса — композитный, отдельно на column2 and column3?

Запросы могут быть разные
Re: Should we use Single Index in case we use Composite index?
От: Alex.Che  
Дата: 24.10.23 09:54
Оценка: 1 (1) +1
Здравствуйте, Aleksei_Lekomtsev, Вы писали:

A_L>Например, есть колонки — column1, column2, column3

A_L>Создали один индекс на все три
A_L>Следует ли еще отдельно создавать индекс на column1, column2, column3? Т.е. в итоге иметь 4 индекса?

A_L>Если я правильно понял, индекс на column1 отдельно создавать не нужно, так как в случае select c where clause/join with column1 будет использоваться композитный индекс(так как это определеяется порядком колонок на которые создали композитный индекс),

A_L>а в случае select c where clause/join with column2, column3 композитный индекс уже использовать не получится. Т.е нужно создавать 3 индекса — композитный, отдельно на column2 and column3?

A_L>Запросы могут быть разные


всё зависит от особенностей конкретного движка СУБД.
Re[2]: Should we use Single Index in case we use Composite index?
От: Aleksei_Lekomtsev  
Дата: 24.10.23 09:56
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Здравствуйте, Aleksei_Lekomtsev, Вы писали:


A_L>>Например, есть колонки — column1, column2, column3

A_L>>Создали один индекс на все три
A_L>>Следует ли еще отдельно создавать индекс на column1, column2, column3? Т.е. в итоге иметь 4 индекса?

A_L>>Если я правильно понял, индекс на column1 отдельно создавать не нужно, так как в случае select c where clause/join with column1 будет использоваться композитный индекс(так как это определеяется порядком колонок на которые создали композитный индекс),

A_L>>а в случае select c where clause/join with column2, column3 композитный индекс уже использовать не получится. Т.е нужно создавать 3 индекса — композитный, отдельно на column2 and column3?

A_L>>Запросы могут быть разные


AC>всё зависит от особенностей конкретного движка СУБД.


PostgreSQL, например
Re: Should we use Single Index in case we use Composite index?
От: vmpire Россия  
Дата: 24.10.23 10:15
Оценка: 130 (3)
Здравствуйте, Aleksei_Lekomtsev, Вы писали:

A_L>Например, есть колонки — column1, column2, column3


A_L>Если я правильно понял, индекс на column1 отдельно создавать не нужно, так как в случае select c where clause/join with column1 будет использоваться композитный индекс(так как это определеяется порядком колонок на которые создали композитный индекс),

Да, это так

A_L>а в случае select c where clause/join with column2, column3 композитный индекс уже использовать не получится. Т.е нужно создавать 3 индекса — композитный, отдельно на column2 and column3?

Зависит от СУБД. В оракле и некоторых других СУБД на этот случай есть index skip scan, но как быстро он будет работать — зависит от данных
Вот тут, например, есть список поддерживающих СУБД: https://wiki.postgresql.org/wiki/Loose_indexscan
Re[2]: Should we use Single Index in case we use Composite index?
От: Aleksei_Lekomtsev  
Дата: 24.10.23 10:22
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, Aleksei_Lekomtsev, Вы писали:


A_L>>Например, есть колонки — column1, column2, column3


A_L>>Если я правильно понял, индекс на column1 отдельно создавать не нужно, так как в случае select c where clause/join with column1 будет использоваться композитный индекс(так как это определеяется порядком колонок на которые создали композитный индекс),

V>Да, это так

A_L>>а в случае select c where clause/join with column2, column3 композитный индекс уже использовать не получится. Т.е нужно создавать 3 индекса — композитный, отдельно на column2 and column3?

V>Зависит от СУБД. В оракле и некоторых других СУБД на этот случай есть index skip scan, но как быстро он будет работать — зависит от данных
V>Вот тут, например, есть список поддерживающих СУБД: https://wiki.postgresql.org/wiki/Loose_indexscan

Спасибо, интересно

Skip scanning is advantageous if there are few distinct values in the leading column of the composite index and many distinct values in the nonleading key of the index.
Re: Should we use Single Index in case we use Composite index?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 24.10.23 12:00
Оценка: 3 (1)
Здравствуйте, Aleksei_Lekomtsev, Вы писали:

A_L>Если я правильно понял, индекс на column1 отдельно создавать не нужно, так как в случае select c where clause/join with column1 будет использоваться композитный индекс(так как это определеяется порядком колонок на которые создали композитный индекс),

Верно

A_L>а в случае select c where clause/join with column2, column3 композитный индекс уже использовать не получится. Т.е нужно создавать 3 индекса — композитный, отдельно на column2 and column3?

Тоже верно.

Индексы (древовидные) это просто заранее отсортированные ключи, отсортированы они в том порядке как указаны в самом индексе. База делает условно бинарный поиск по этому "массиву". Если вы отсортировали по (column1, column2), то для поиска по column1 этот индекс может использоваться. А для поиска по column2 — нет.

Иногда моет быть полезно сделать отдельный индекс по column1 чтобы уменьшить его объем, но это очень редкий кейс.
Re[3]: Should we use Single Index in case we use Composite index?
От: VladiCh  
Дата: 08.12.23 07:34
Оценка:
Здравствуйте, Aleksei_Lekomtsev, Вы писали:

A_L>Здравствуйте, Alex.Che, Вы писали:


AC>>Здравствуйте, Aleksei_Lekomtsev, Вы писали:


A_L>>>Например, есть колонки — column1, column2, column3

A_L>>>Создали один индекс на все три
A_L>>>Следует ли еще отдельно создавать индекс на column1, column2, column3? Т.е. в итоге иметь 4 индекса?

A_L>>>Если я правильно понял, индекс на column1 отдельно создавать не нужно, так как в случае select c where clause/join with column1 будет использоваться композитный индекс(так как это определеяется порядком колонок на которые создали композитный индекс),

A_L>>>а в случае select c where clause/join with column2, column3 композитный индекс уже использовать не получится. Т.е нужно создавать 3 индекса — композитный, отдельно на column2 and column3?

A_L>>>Запросы могут быть разные


AC>>всё зависит от особенностей конкретного движка СУБД.


A_L>PostgreSQL, например


Postgres умеет разные типы индексов использовать. Есть например GiST индекс, его он умеет сканировать по любым комбинациям колонок.
Если создать отдельные индексы на column1 и column2, column3 то он может использовать Bitmap Index Scan, то есть сканировать два индекса по отдельности.
Нужно разбираться конкретно с требованиями в общем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.