Indeksy
-
Potrzebujesz - przynajmniej - indeks na każdym polu, które jest używane w
JOIN
stan. -
Indeksy w polach, które pojawiają się w
WHERE
lubGROUP BY
lubORDER BY
klauzule są również w większości przypadków przydatne. -
Gdy w tabeli dwa lub więcej pól jest używanych w JOIns (lub WHERE lub GROUP BY lub ORDER BY), złożony (połączony) indeks tych (dwóch lub więcej) pól może być lepszy niż oddzielne indeksy. Na przykład w
SiteNumbers
tabela, możliwe indeksy to związek(number_accountid, number_active)
lub(number_active, number_accountid)
. -
Warunek w polach, które są logiczne (ON/OFF, aktywne/nieaktywne) czasami spowalniają zapytania (ponieważ indeksy nie są selektywne i przez to nie są zbyt pomocne). Restrukturyzacja (normalizacja ojca) tabel jest w takim przypadku opcją, ale prawdopodobnie można uniknąć dodatkowej złożoności.
Oprócz zwykłych porad (zbadaj plan EXPLAIN, w razie potrzeby dodaj indeksy, przetestuj odmiany zapytania),
Zauważyłem, że w Twoim zapytaniu znajduje się częściowy Produkt Kartezjański. Tabela Accounts
ma relacje jeden-do-wielu z trzema tabelami FTPDetails
, SiteNumbers
i PPC
. Powoduje to, że jeśli masz na przykład 1000 kont, a każde konto jest powiązane z, powiedzmy, 10 szczegółami FTP, 20 numerami witryny i 3 PPC, zapytanie zwróci dla każdego konta 600 wierszy (iloczyn 10x20x3). Łącznie 600 tys. wierszy, w których duplikuje się wiele danych.
Zamiast tego można podzielić zapytanie na trzy plus jeden dla danych podstawowych (konto i pozostałe tabele). W ten sposób przesłano by tylko 34 tys. wierszy danych (mających mniejszą długość) :
Accounts JOIN Clients JOIN Users
(with all fields needed from these tables)
1K rows
Accounts JOIN FTPDetails
(with Accounts.account_id and all fields from FTPDetails)
10K rows
Accounts JOIN SiteNumbers
(with Accounts.account_id and all fields from SiteNumbers)
20K rows
Accounts JOIN PPC
(with Accounts.account_id and all fields from PPC)
3K rows
a następnie użyj danych z 4 zapytań po stronie klienta, aby wyświetlić połączone informacje.
Dodałbym następujące indeksy:
Table Accounts
index on (account_designer)
index on (account_client)
index on (account_active, account_id)
index on (account_update)
Table FTPDetails
index on (ftp_active, ftp_accountid)
Table SiteNumbers
index on (number_active, number_accountid)
Table PPC
index on (ppc_active, ppc_accountid)