Подтвердить что ты не робот

Как работают составные индексы?

Я создал сводные индексы (индексы для вас, математические люди) на таблицах раньше, с предположением о том, как они работают. Мне было просто любопытно, правильно ли мое предположение или нет.

Я предполагаю, что когда вы указываете порядок столбцов для индекса, вы также указываете, как будут группироваться индексы. Например, если у вас есть столбцы a, b и c, и вы указываете индекс в том же порядке a ASC, b ASC и c ASC, то итоговый индекс будет по существу иметь много индексов для каждой "группы" в a.

Это правильно? Если нет, каков будет фактический результат?

4b9b3361

Ответ 1

Композитные индексы работают точно так же, как и обычные индексы, за исключением того, что они имеют многозначные ключи.

Если вы определяете индекс в полях (a, b, c), записи сортируются сначала на a, затем b, затем c.

Пример:

| A | B | C |
-------------
| 1 | 2 | 3 |
| 1 | 4 | 2 |
| 1 | 4 | 4 |
| 2 | 3 | 5 |
| 2 | 4 | 4 |
| 2 | 4 | 5 |

Ответ 2

Компонентный индекс похож на обычный алфавитный указатель в словаре, но охватывает две или более буквы, например:

AA - page 1
AB - page 12

и др.

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

Используется при поиске по обоим столбцам ИЛИ по первому столбцу. Если ваш индекс выглядит следующим образом:

AA - page 1
AB - page 12
…
AZ - page 245
BA - page 246
…

вы можете использовать его для поиска по 2 буквам (= 2 столбцам в таблице) или как простой индекс для одной буквы:

A - page 1
B - page 246
…

Обратите внимание, что в случае словаря страницы сами по алфавиту упорядочены. Это пример индекса CLUSTERED.

В обычном индексе CLUSTERED ссылки на страницы упорядочены, как в книге истории:

Gaul, Alesia: pages 12, 56, 78
Gaul, Augustodonum Aeduorum: page 145
…
Gaul, Vellaunodunum: page 24
Egypt, Alexandria: pages 56, 194, 213, 234, 267

Композитные индексы также могут использоваться, если вы ORDER BY двух или более столбцов. В этом случае предложение DESC может пригодиться.

См. эту статью в моем блоге об использовании предложения DESC в составном индексе:

Ответ 3

Наиболее распространенная реализация индексов использует B-деревья, позволяющие несколько быстрого поиска, а также достаточно быстрое сканирование диапазона. Это слишком много, чтобы объяснить здесь, но здесь статья Википедии о B-деревья. И вы правы, первый столбец, который вы объявляете в индексе создания, будет столбцом высокого порядка в полученном B-дереве.

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

Если вы ищете все карты для авторов, чья фамилия "Clemens", вы просто заходите в каталог авторов и очень быстро найдете ящик с надписью "CLE-CLI" на передней панели. Это правильный ящик. Теперь вы делаете некий неформальный бинарный поиск в этом ящике, чтобы быстро найти все карты, на которых говорят "Клеменс, Роджер" или "Клеменс, Самуэль".

Но предположим, что вы хотите найти все карты для авторов, чье имя - "Самуэль". Теперь вы за рулем, потому что эти карты не собраны в одном месте в каталоге "Автор". Подобное явление происходит с составными индексами в базе данных.

Различные СУБД отличаются тем, насколько умны их оптимизаторы при обнаружении сканирования диапазона индексов и точно оценивают их стоимость. И не все индексы являются B-деревьями. Вам нужно будет прочитать документы для вашей конкретной СУБД, чтобы получить реальную информацию.

Ответ 4

Нет. Результирующий индекс будет единственным индексом, но с составным ключом.

KeyX = A, B, C, D; KeyY = 1,2,3,4;

Index KeyX, KeyY будет фактически: A1, A2, A3, B1, B3, C3, C4, D2

Итак, если вам нужно что-то найти с помощью KeyX и KeyY - это будет быстро и будет использовать один индекс. Что-то вроде SELECT... WHERE KeyX = "B" AND KeyY = 3.

Но важно понимать: WHERE KeyX =? запросы будут использовать этот индекс, а WHERE KeyY =? будет НЕ использовать такой индекс вообще.

Ответ 5

Я понимаю, что составные индексы работают точно так же, как обычные индексы, за исключением того, что они имеют многозначные ключи. Если вы определяете индекс в полях (a, b, c), так как составной индекс будет храниться в BinaryTree, поэтому ваш индекс будет работать только после комбинаций поисков.

ABC
AB
A

Например, создание составного индекса для полей a, b и c эквивалентно созданию отдельных индексов для a, ab и abc.