sql >> Database >  >> RDS >> Mysql

Hoe kan ik MySQL-query's versnellen met meerdere joins?

Ik zou het volgende proberen:

Zorg er eerst voor dat er indexen zijn in de volgende tabellen en kolommen (elke set kolommen tussen haakjes moet een aparte index zijn):

table1 : (subscribe, CDate)
         (CU_id)
table2 : (O_cid)
         (O_ref)
table3 : (I_oref)
         (I_pid)
table4 : (P_id)
         (P_cat)
table5 : (C_id, store)

Ten tweede, als het toevoegen van de bovenstaande indexen heeft de zaken niet zoveel verbeterd als je zou willen, probeer de zoekopdracht te herschrijven als

SELECT DISTINCT t1.first_name, t1.last_name, t1.email FROM
  (SELECT CU_id, t1.first_name, t1.last_name, t1.email
     FROM table1
     WHERE subscribe = 1 AND
           CDate >= $startDate AND
           CDate <= $endDate) AS t1
  INNER JOIN table2 AS t2
    ON t1.CU_id = t2.O_cid   
  INNER JOIN table3 AS t3
    ON t2.O_ref = t3.I_oref   
  INNER JOIN table4 AS t4
    ON t3.I_pid = t4.P_id   
  INNER JOIN (SELECT C_id FROM table5 WHERE store = 2) AS t5
    ON t4.P_cat = t5.C_id

Ik hoop hier dat de eerste subselectie het aantal rijen dat in aanmerking komt voor deelname aanzienlijk zou verminderen, waardoor de volgende joins hopelijk minder werk doen. Idem voor de redenering achter de tweede subselectie op tabel5.

Ga er in ieder geval mee aan de slag. Ik bedoel, uiteindelijk is het gewoon een SELECT - je kunt er niets mee doen. Onderzoek de plannen die worden gegenereerd door elke verschillende permutatie en probeer erachter te komen wat goed of slecht is aan elk.

Deel en geniet.



  1. Updatequery werkt niet in mysql workbench

  2. MySQL hoe voeg ik geen dubbele rijen toe als ik SUM en COUNT gebruik met meerdere INNER JOINS?

  3. php-server ERR_CONNECTION_REFUSED

  4. Hoe PostgreSQL 12-replicatie en failover te automatiseren met repmgr - Deel 2