Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę przyspieszyć zapytanie MySQL za pomocą wielu złączeń?

Spróbowałbym następujących:

Najpierw upewnij się, że w następujących tabelach i kolumnach znajdują się indeksy (każdy zestaw kolumn w nawiasach powinien być osobnym indeksem):

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

Po drugie, jeśli dodanie powyższych indeksów nie poprawiło sytuacji tak bardzo, jak byś chciał, spróbuj przepisać zapytanie 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

Mam nadzieję, że pierwszy wybór podrzędny znacznie zmniejszy liczbę wierszy, które należy wziąć pod uwagę przy łączeniu, mając nadzieję, że kolejne łączenia będą mniej pracochłonne. To samo dotyczy rozumowania drugiego podwyboru w tabeli 5.

W każdym razie zadzieraj z tym. Chodzi mi o to, że ostatecznie to tylko SELECT - tak naprawdę nie możesz nim zaszkodzić. Zbadaj plany generowane przez każdą inną permutację i spróbuj dowiedzieć się, co jest w nich dobre, a co złe.

Dziel się i ciesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql gdzie ciąg kończy się liczbami

  2. Przechowuj UUID v4 w MySQL

  3. Serwer Ruby on Rails nie uruchamia się:dyld:leniwe wiązanie symbolu nie powiodło się:Nie znaleziono symbolu:_mysql_get_client_info

  4. Jak zsynchronizować dbfs Visual Foxpro z MySQL?

  5. SQL:Jak wybrać jeden rekord na dzień, zakładając, że każdy dzień zawiera więcej niż 1 wartość MySQL