sql >> Databasteknik >  >> RDS >> Mysql

Hur skulle jag få den här frågan att köras snabbare?

Index

  • Du behöver - minst - ett index på varje fält som används i en JOIN skick.

  • Indexer på fälten som visas i WHERE eller GROUP BY eller ORDER BY klausuler är för det mesta också användbara.

  • När i en tabell används två eller flera fält i JOIns (eller WHERE eller GROUP BY eller ORDER BY), kan ett sammansatt (kombinerat) index av dessa (två eller fler) fält vara bättre än separata index. Till exempel i SiteNumbers tabell, möjliga index är sammansättningen (number_accountid, number_active) eller (number_active, number_accountid) .

  • Tillstånd i fält som är booleska (PÅ/AV, aktiv/inaktiv) är ibland långsammare frågor (eftersom index inte är selektiva och därför inte är särskilt användbara). Omstrukturering (fadernormalisering) av tabellerna är ett alternativ i så fall, men förmodligen kan du undvika den extra komplexiteten.

Förutom de vanliga råden (granska EXPLAIN-planen, lägg till index vid behov, testa varianter av frågan),

Jag märker att det i din fråga finns en partiell kartesisk produkt. Tabellen Accounts har en en-till-många-relationer till tre tabeller FTPDetails , SiteNumbers och PPC . Detta har effekten att om du till exempel har 1000 konton, och varje konto är relaterat till, säg, 10 FTPDetails, 20 SiteNumbers och 3 PPCs, kommer frågan att returnera 600 rader för varje konto (produkten av 10x20x3). Totalt 600 000 rader där många data dupliceras.

Du kan istället dela upp frågan i tre plus en för basdata (Konto och resten tabeller). På så sätt skulle endast 34K rader med data (med mindre längd) överföras:

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

och använd sedan data från de 4 frågorna på klientsidan för att visa kombinerad information.

Jag skulle lägga till följande index:

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. PostgreSQL vs. MySQL:Vilket är bäst?

  2. Hur man söker i JSON-array i MySQL?

  3. Många-till-många-relationer i MySQL

  4. Hur man använder en fallbeskrivning för att avgöra vilket fält som ska gå med i