В чем разница между созданием индекса по 2 столбцам и индексом по каждому из столбцов в отдельности? - PullRequest
4 голосов
/ 17 декабря 2008

Я новичок в индексации базы данных, если у меня есть 2 столбца в таблице, которые являются хорошим выбором для индексации, например,

[Posts](    
   [PostID] [int] IDENTITY(1,1) NOT NULL,
   [UserName] [nvarchar](64) NOT NULL,
   [ApplicationType] [smallint] NOT NULL,
   ...
)

в этом случае PostID будет индексом PRIMARY KEY CLUSTERED, тогда я хочу сделать больше индексирования, так как это большая таблица, и я хочу сделать для UserName и ApplicationType, теперь я должен индексировать каждый по отдельности (один на UserName, один на ApplicationType) или индексировать их целиком (один индекс для UserName, ApplicationType вместе)? Есть ли ограничение на количество индексов, которые я могу иметь, прежде чем делать это плохой практикой? Каково общее правило по этому вопросу?

Спасибо

Ray.

Ответы [ 3 ]

8 голосов
/ 17 декабря 2008

Имейте в виду правило телефонной книги для составных индексов: телефонная книга эффективно индексируется по фамилии, имени. Это составной индекс.

Если вы ищете людей по имени «Смит, Джон», тогда полезно, чтобы имя было частью индекса. Как только вы найдете записи с фамилией «Смит», вы сможете быстро найти «Джона».

Но если вам нужно искать каждого по имени "Джон", то индексация телефонной книги не поможет - вам все равно придется искать всю книгу.

Так что составные индексы хороши, если вы ищете по первому столбцу, названному в индексе, и, необязательно, по второму и т. Д. Но если ваш поиск пропускает самые левые столбцы в индексе, он бесполезен для этого поиска.

2 голосов
/ 17 декабря 2008

Ответ на этот вопрос действительно зависит от того, как вы собираетесь искать на столе. Если ваши поиски почти всегда будут включать оба столбца, то создание индекса для обоих столбцов является уместным. Если вы будете часто выполнять поиск по каждому полю самостоятельно, тогда целесообразно создавать отдельные индексы для каждого из них. В конце концов, вы можете иметь все 3 индекса (один составной, 2 отдельных столбца) - в зависимости от того, как вы ведете поиск по столбцам. Думайте об этом как о телефонной книге - если вы всегда ищете фамилию и имя, вы найдете то, что ищете. Но если вы хотите найти в телефонной книге всех с именем Скотта, вам нужен новый индекс, которого не было (LName, FName). Если вы хотите найти всех с заданной фамилией, вы все равно можете сделать это с помощью индекса из нескольких столбцов (LName, FName).

Каждая база данных имеет свои собственные ограничения на количество индексов в таблице, количество столбцов в индексе и т. Д. Они, как правило, достаточно высоки, и если вы посмотрите на 3 индекса здесь, вам не придется беспокоиться о них , Кроме того, имейте в виду, что чем больше у вас индексов, тем больше затрат на их обслуживание (вставки, обновления, удаления и т. Д.).

1 голос
/ 17 декабря 2008

IIRC, эмпирическое правило заключается в том, что указатель может использоваться только для поиска, в котором используются все столбцы из некоторой точки и слева. Например, индекс по столбцам (a, b, c, d) можно использовать, если вы выполняете запрос к (a), (a, b), (a, b, c) или (a, b, c, d) но не на (a, c), например.

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


Редактировать: как указывает BQ, СУБД может сканировать полную часть индекса * a и выполнить поиск в части b (я не знала, что это было фактически сделано). Однако это не так быстро, как индекс, который может использовать правило, как описано выше (OTOH может быть быстрее, чем полное сканирование таблицы).

Лично я не думаю, что это нужно намеренно использовать. Если для определенного запроса достаточно ответа perf, который вы рассматриваете, какие индексы необходимы, вы могли бы также дать ему правильные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...