sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg fremskynde MySQL-forespørgsel med flere joinforbindelser

Jeg ville prøve følgende:

Først skal du sikre dig, at der er indekser på følgende tabeller og kolonner (hvert sæt kolonner i parentes skal være et separat indeks):

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

For det andet hvis tilføjelse af ovenstående indekser forbedrede ikke tingene så meget, som du gerne ville, prøv at omskrive forespørgslen som

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

Jeg håber her, at det første undervalg ville skære betydeligt ned på antallet af rækker, der skal tages i betragtning til at deltage, og forhåbentlig få de efterfølgende sammenføjninger til at gøre mindre arbejde. Ditto ræsonnementet bag det andet undervalg på tabel 5.

Under alle omstændigheder, rode med det. Jeg mener, i sidste ende er det bare et SELECT - du kan ikke rigtig skade noget med det. Undersøg de planer, der genereres af hver forskellig permutation, og prøv at finde ud af, hvad der er godt eller dårligt ved hver enkelt.

Del og nyd.



  1. Django + MySQL - Ukendt kodning:utf8mb4

  2. Implementering af twitter og facebook som hashtags

  3. Mysql inden for afstand forespørgsel

  4. Ændring af MySQL root-adgangskode