sql >> Database >  >> RDS >> Mysql

Hoe kan ik deze query sneller laten lopen?

Indexen

  • Je hebt - minstens . nodig - een index op elk veld dat wordt gebruikt in een JOIN staat.

  • Indexen op de velden die verschijnen in WHERE of GROUP BY of ORDER BY clausules zijn meestal ook nuttig.

  • Wanneer in een tabel twee of meer velden worden gebruikt in JOIns (of WHERE of GROUP BY of ORDER BY), kan een samengestelde (gecombineerde) index van deze (twee of meer) velden beter zijn dan afzonderlijke indexen. Bijvoorbeeld in de SiteNumbers tabel, mogelijke indexen zijn de samengestelde (number_accountid, number_active) of (number_active, number_accountid) .

  • Voorwaarde in velden die Booleaans zijn (AAN/UIT, actief/inactief) vertragen soms zoekopdrachten (omdat indexen niet selectief zijn en dus niet erg nuttig). Herstructureren (vader normaliseren) van de tabellen is in dat geval een optie, maar waarschijnlijk kun je de extra complexiteit vermijden.

Naast het gebruikelijke advies (bekijk het EXPLAIN plan, voeg indexen toe waar nodig, test variaties van de zoekopdracht),

Ik merk dat er in uw vraag een gedeeltelijk Cartesiaans product is. De tabel Accounts heeft een één-op-veel relatie met drie tabellen FTPDetails , SiteNumbers en PPC . Dit heeft als effect dat als je bijvoorbeeld 1000 accounts hebt, en elke account is gerelateerd aan bijvoorbeeld 10 FTPDetails, 20 SiteNumbers en 3 PPC's, de query voor elke account 600 rijen teruggeeft (het product van 10x20x3). In totaal 600K rijen waar veel gegevens worden gedupliceerd.

U kunt de query in plaats daarvan splitsen in drie plus één voor basisgegevens (account en de overige tabellen). Op die manier zouden slechts 34K gegevensrijen (met een kleinere lengte) worden overgedragen:

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

en gebruik vervolgens de gegevens van de 4 zoekopdrachten aan de clientzijde om gecombineerde informatie weer te geven.

Ik zou de volgende indexen toevoegen:

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. Hoe MySQL 5.7 te installeren op Amazon ec2

  2. Kunnen we parameters doorgeven aan een weergave in SQL?

  3. Hoe html naar pdf te converteren met php?

  4. MySQL:tijdelijke kolom automatisch verhogen in select-statement