Я вже дещо знаю відповідь на це питання, але завжди відчуваю, ніби є більше, що мені потрібно підібрати до цієї теми.
Моє основне розуміння полягає в тому, що загалом кажучи, єдиний індекс, який просто включає всі поля, на які ви можете запитувати / сортувати, в будь-який момент часу, ймовірно, не буде корисним, але я бачив подібний предмет. Як і в когось, хтось подумав: "Ну, якщо ми просто помістимо все це в індекс, база даних може використовувати його для пошуку того, що йому потрібно", не бачачи жодного разу план виконання деяких фактичних запитів, які виконуються.
Уявіть собі таку таблицю:
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?