Я уже немного знаю ответ на этот вопрос, но я всегда чувствую, что мне нужно еще кое-что узнать по этой теме.
Мое базовое понимание состоит в том, что, вообще говоря, единый индекс, который включает в себя все поля, которые вы можете запрашивать / сортировать в любой момент времени, вряд ли будет полезен, но я видел подобные вещи. Например, кто-то подумал: «Ну, если мы просто поместим все эти вещи в индекс, база данных сможет использовать его, чтобы найти то, что ему нужно», даже не видя плана выполнения для некоторых из выполняемых запросов.
Представьте себе таблицу примерно так:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Я мог бы увидеть один индекс в том числе name
, customerId
и dateCreated
пол.
Но я понимаю, что такой индекс не будет использоваться в запросе, например:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Для такого запроса, то мне кажется , что лучшая идея будет индексом в том числе customerId
и dateCreated
поле, с customerId
полем является «первым». Это создало бы индекс, в котором данные были бы организованы таким образом, чтобы этот запрос мог быстро найти то, что ему нужно - в том порядке, в котором он нуждается.
Еще одна вещь, которую я вижу, возможно, так же часто, как первая, - это индивидуальные индексы в каждом поле; так, по одному наname
, customerId
и dateCreated
поля.
В отличие от первого примера, этот тип расположения иногда кажется мне хотя бы частично полезным; план выполнения запроса может показать, что по крайней мере он использует индекс наcustomerId
для выбора записей, но не использует индекс с dateCreated
полем для их сортировки.
Я знаю, что это широкий вопрос, потому что конкретный ответ на любой конкретный запрос к любому конкретному набору таблиц обычно состоит в том, чтобы увидеть, что план выполнения говорит, что он собирается делать, и в противном случае принять специфику таблиц и запросов в Счет. Кроме того, я знаю, что это зависит от того, как часто может выполняться запрос, в отличие от затрат на поддержание определенного индекса для него.
Но я предполагаю, что то, что я спрашиваю, является общей «отправной точкой» для индексов, имеет ли смысл иметь конкретные индексы для конкретных часто запрашиваемых запросов и полей в предложениях WHERE или ORDER BY?