Indexy
-
Potřebujete – alespoň - index každého pole, které se používá v
JOIN
podmínka. -
Indexy polí, která se zobrazují v
WHERE
neboGROUP BY
neboORDER BY
klauzule jsou také většinou užitečné. -
Když jsou v tabulce použita dvě nebo více polí v JOIns (nebo WHERE nebo GROUP BY nebo ORDER BY), složený (kombinovaný) index těchto (dvou nebo více) polí může být lepší než samostatné indexy. Například v
SiteNumbers
tabulka, možné indexy jsou složené(number_accountid, number_active)
nebo(number_active, number_accountid)
. -
Podmínka v polích, která jsou logická (ON/OFF, aktivní/neaktivní) jsou někdy zpomalující dotazy (protože indexy nejsou selektivní, a proto nejsou příliš užitečné). Restrukturalizace (otcovská normalizace) tabulek je v takovém případě možností, ale pravděpodobně se můžete vyhnout přidané složitosti.
Kromě obvyklých rad (prozkoumejte plán EXPLAIN, přidejte indexy tam, kde je to potřeba, otestujte varianty dotazu),
Všiml jsem si, že ve vašem dotazu je částečný kartézský součin. Tabulka Accounts
má vztahy jedna k mnoha třem tabulkám FTPDetails
, SiteNumbers
a PPC
. To má za následek, že pokud máte například 1000 účtů a každý účet souvisí například s 10 FTPDetaily, 20 SiteNumbers a 3 PPC, dotaz vrátí pro každý účet 600 řádků (součin 10x20x3). Celkem 600 tisíc řádků, kde je mnoho dat duplikováno.
Místo toho můžete dotaz rozdělit na tři plus jedna pro základní data (tabulky účtů a ostatní). Tímto způsobem by bylo přeneseno pouze 34 kB řádků dat (s menší délkou):
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 poté použijte data ze 4 dotazů na straně klienta k zobrazení kombinovaných informací.
Přidal bych následující indexy:
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)