sql >> Databáze >  >> RDS >> Mysql

Jak mohu urychlit dotaz MySQL pomocí více spojení

Zkusil bych následující:

Nejprve se ujistěte, že v následujících tabulkách a sloupcích jsou indexy (každá sada sloupců v závorkách by měla být samostatným indexem):

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

Za druhé, pokud přidáním výše uvedených indexů se věci nezlepšily tak, jak byste chtěli, zkuste dotaz přepsat jako

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

Doufám, že první dílčí výběr by výrazně snížil počet řádků, které je třeba vzít v úvahu pro spojení, a doufejme, že následné spojení bude méně práce. Stejně jako zdůvodnění druhého dílčího výběru v tabulce 5.

V každém případě se s tím popasujte. Chci říct, že v konečném důsledku je to jen VÝBĚR – tím opravdu nemůžete nic zkazit. Prozkoumejte plány, které jsou generovány každou jinou permutací, a pokuste se zjistit, co je na každém dobré nebo špatné.

Sdílejte a užívejte si.



  1. Jak mohu vložit mnoho řádků do tabulky MySQL a vrátit nová ID?

  2. Zabití procesu mysqld

  3. Ukládání objektů Python Pickled v databázi MySQL

  4. Naše nejoblíbenější databázové blogové příspěvky v roce 2017