Ważne jest, aby pamiętać, że kolejność pól w indeksie jest ważne.
Indeks jest w pewnym sensie drzewem wyszukiwania. Jeśli indeksujesz (B.event, B.state), drzewo zgrupuje wszystkie rekordy z polem "zdarzenie" zapisu, a następnie uporządkuje je według pola "stan".
Gdybyś wtedy zapytał ten indeks o "b.state = x", indeks byłby mało przydatny; Indeks jest uporządkowany najpierw przez "wydarzenie".
W przykładzie:
- filtr A przez to jest "zdarzenie" field
- dołącz A.event do B.event
- dołącz B.state do C.id
- Dołącz B.hur = D.id
- Zamówienie przez B.event, B.timestamp
ważne jest, aby pamiętać, że optymalizacja będzie patrzeć na statystyki tabel i indeksów, a następnie może ponownie zmienić kolejność połączenia. Wynik będzie taki sam, ale kolejność może dać inną wydajność, a zadaniem optymalizatora jest próba znalezienia najlepszej wydajności.
W twoim przypadku oczekiwałbym, że zamówienie B.event będzie niezwykle ważne. Po prostu dlatego, że jest to kolejność wynikowego wyniku, I to jest pole, przez które filtrujesz.
Następnie dołączasz B.state do C.id. Zatem posiadanie i indeksowanie na C.id jest dobre, dzięki czemu łączenie jest szybsze. Ale równie dobrze posiadanie danych tabeli B w ładnej kolejności może również przyspieszyć połączenie.
Ale posiadanie indeksu na B.event i osobnego indeksu na B. stan może dać niewiele. Indeks B.state staje się obok bezcelowy, ponieważ używamy indeksu B.event. Jeśli połączysz te dwa w jeden indeks (b.event, a następnie b.state), plan wykonania może znaleźć sposób na użycie części b.state indeksu.
Ostatecznie, jeśli umieścisz wszystkie pola w indeksie, indeks się zwiększy, ale zapytanie może nigdy nie zajrzeć do tabeli. Informacje znajdują się w indeksie. Czas potrzebny do przejścia z indeksu do tabeli w celu znalezienia "brakujących" pól jest podobny do czasu łączenia. Tak więc dla wydajności odczytu, dodanie dodatkowych pól do indeksu może być znaczące.
mam Wittering na teraz, ale podsumowanie jest takie:
- Zwykle oddzielny indeks na oddzielnych pól nie przyzwyczaić razem
- Dla indeksów kompozytowych, kolejność określić pola robi różnicę
- Dodanie "dodatkowych" pól do indeksu powoduje, że jest on większy, ale może również przyspieszyć zapytania.
- Kolejność planu wykonania ma większe znaczenie niż kolejność zapytań.
- Ale posiadane indeksy mogą określać kolejność plan wykonania:
Ten rodzaj pracy ma brak kategorycznych odpowiedzi. To zależy od twoich danych, jest bliższe sztuce.
Jedną opcją jest przeciążenie tabel indeksami, sprawdzenie wynikowego planu wykonania i usunięcie indeksów, które nie są potrzebne.
Ale nawet tam obowiązuje zastrzeżenie. Ponieważ plan wykonania jest zależny od danych (i statystyk tabel), bardzo ważne jest, aby dane rzeczywiste w tabelach były prawdziwe. Podczas gdy tabele mają 10 lub 100 wierszy, jeden plan wykonania może być najszybszy. Ale gdy otrzymasz miliony wierszy, plan wykonania może się zmienić, a więc korzystać z różnych indeksów.
Prawidłowo, ale sprawdź, czy w rzeczywistości użyty zostanie B.timestamp. – Pomyk
Jak duże są poszczególne tabele i ile wierszy będzie pasować do danego zapytania. Z której bazy danych korzystasz? –
Ponadto, jak często dane są dodawane do tabel i jak często ma być uruchamiane zapytanie? –