sql >> Databáze >  >> RDS >> Mysql

Jak bych zrychlil tento dotaz?

Indexy

  • Potřebujete – alespoň - index každého pole, které se používá v JOIN podmínka.

  • Indexy polí, která se zobrazují v WHERE nebo GROUP BY nebo ORDER 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)


  1. 12.2 Nové funkce RAC/GI

  2. Jak napsat dotaz, který dělá něco podobného jako GROUP_CONCAT MySQL v Oracle?

  3. Django ManyToMany prostřednictvím více databází

  4. Nemohu spustit bundler, stále se zobrazuje chyba