sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag snabba upp MySQL-frågan med flera kopplingar

Jag skulle prova följande:

Se först till att det finns index i följande tabeller och kolumner (varje uppsättning kolumner inom parentes bör vara ett separat index):

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

För det andra, om att lägga till ovanstående index förbättrade inte saker så mycket som du skulle vilja, försök att skriva om frågan 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

Jag hoppas här att det första undervalet skulle minska avsevärt antalet rader som ska övervägas för att gå med, förhoppningsvis göra att de efterföljande sammanfogningarna gör mindre arbete. Dito resonemanget bakom det andra undervalet på tabell 5.

Bråka i alla fall med det. Jag menar, i slutändan är det bara ett SELECT - du kan egentligen inte skada någonting med det. Undersök planerna som genereras av varje olika permutation och försök ta reda på vad som är bra eller dåligt med var och en.

Dela och njut.



  1. En översikt över PRINT-satsen i SQL Server

  2. Rails Migration byter kolumn för att använda Postgres-matriser

  3. MySQL kontra PDO

  4. Hur man använder främmande nyckel när man frågar från två tabeller