Jeśli moja tabela User
ma kilka pól, które można wywoływać (np. ID działu, GroupId, RoleId) czy spowoduje jakąkolwiek różnicę szybkości, jeśli utworzę indeks dla każdej kombinacji tych pól?Czy konieczne jest posiadanie indeksu dla każdej kombinacji pól do zapytania w tabeli SQL w celu optymalizacji wydajności?
Przez "możliwy do zapytania", mam na myśli ekran zapytania, w którym użytkownik końcowy może wybrać rekordy na podstawie działu, grupy lub roli, wybierając z listy rozwijanej.
W tej chwili mam indeks na DepartmentId, GroupId i RoleId. To pojedynczy nieunikalny indeks na pole.
Jeśli użytkownik wybierze opcję „nikogo w grupie B”, SQL wygląda następująco:
select * from User where GroupId = 2
o wskaźniku na GroupID powinna przyspieszyć że w górę.
Ale jeśli użytkownik końcowy wybierz „nikogo w grupie B iw Rola C”, SQL wyglądałby następująco:
select * from User where GroupId = 2 and RoleId = 3
Posiadanie indeksów GroupID i RoleId indywidualnie mogą nie robi żadnej różnicy, prawda?
Lepszym indeksem dla tego wyszukiwania byłby jeden indeks obejmujący zarówno GroupId, jak i RoleId.
Ale jeśli tak jest, to oznaczałoby, że musiałbym mieć indeks dla każdej kombinacji pól, które można przypisać. Więc muszę wszystkie te indeksy:
- DepartmentId
- GroupID
- RoleId
- DepartmentId i GroupID
- DepartmentId i RoleId
- GroupID i RoleId
- ID działu, GroupID i RoleId
Czy ktoś może rzucić trochę światła na to? Używam MySQL, jeśli to robi różnicę.
Należy pamiętać, że kolejność kolumn ma znaczenie - (GroupId, RoleId) * nie * jest taka sama jak (RoleId, GroupId). Tak więc na liście brakuje wielu dodatkowych oznaczeń.W przeciwnym razie komentarz @ Joe na temat łączenia indeksów jest dobry (DB2 również to stosuje, aby uzyskać dobry efekt). –