Использование индекса b-tree для нескольких столбцов в таблице

Насколько мне известно, одним из наиболее распространенных индексов в базе данных является тот, который использует b-tree.

Если у меня есть индекс для целочисленного столбца

column1 column2
   2     name2
   3     name3
   1     name4

он может создать индекс, который выглядит так

 2
| |
1 3

Если я использую column2, он может создать его так

   name2
 |      |
name1 name3

Но если у меня есть составной индекс с двумя полями, как он тогда его упорядочит? Будет ли это просто базовое сравнение для двух столбцов?

Есть ли какие-то другие дополнительные оптимизации, которые база данных выполняет для структуры индекса?

Какие СУБД вы используете? (Это вопрос, относящийся к конкретному продукту, поскольку в продуктах индексы реализуются по-разному.)

jarlh 09.01.2019 11:18

@jarlh ho, значит, в зависимости от поставщика индекс b-дерева может отличаться? Я думал, что все используют одни и те же алгоритмы

lapots 09.01.2019 11:24

@jarlh Меня интересует общий обзор всех dbms. Хотя сам использую postgres

lapots 09.01.2019 11:25

Что ж, возможно, они это сделают. Еще лучше получить ответы от людей, знающих Postgresql.

jarlh 09.01.2019 11:25

@jarlh Я не особо забочусь о вендоре. Я просто хочу посмотреть, как это вообще реализовано независимо от dbms

lapots 09.01.2019 11:27

Наверное, самое подробное описание здесь: github.com/postgres/postgres/blob/master/src/backend/access/‌…

a_horse_with_no_name 09.01.2019 14:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
777
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все несколько ключей используются вместе в индексе:

     2,name2
     |     |
1,name4  3,name3

Сравнение производится по первому ключе. Только в случае завязки используется следующий ключ. Итак, если бы все числа были одинаковыми, у вас было бы:

     2,name2
     |     |
2,name3  2,name4

Так что если я поставлю 2, name5 для первого случая, он отправит его вправо на лист 3, name3?

lapots 09.01.2019 13:33

Если у вас 2, name5, то «2» равны, и name5> name2, поэтому он будет идти вправо.

Gordon Linoff 09.01.2019 14:04

Я понимаю. Но, в конце концов, это отдельная структура, на которую ссылается исходная таблица?

lapots 09.01.2019 15:48

@lapots. . . да. Postgres даже не поддерживает кластерные индексы, поэтому структура всегда отдельная. В базах данных, поддерживающих кластерный индекс, конечные узлы кластерного индекса являются страницами данных. Но фактическая иерархия индекса всегда отделена от данных.

Gordon Linoff 09.01.2019 16:03

так иерархия - это отдельная сущность? Я думал, что он хранит все как единую структуру

lapots 09.01.2019 16:12

@lapots. . . Индексы - это отдельные сущности. Являются ли они «частью стола» - вопрос скорее логичный. Данные для индекса не хранятся на страницах данных, используемых для таблицы.

Gordon Linoff 09.01.2019 17:20

Я понял, что индексы - это отдельные объекты, но я не уверен, что понимаю, как он хранит иерархию (насколько я понимаю, данные индекса хранятся как какой-то упорядоченный набор)

lapots 09.01.2019 19:11

@lapots. . . Ключи дублируются в структуре индекса. Я думаю, что может быть документация по подробной структуре.

Gordon Linoff 09.01.2019 20:38

Другие вопросы по теме