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

Dlaczego to zapytanie INNER JOIN/ORDER BY mysql jest tak wolne?

(Zakładam, że chodziło Ci o wpisanie ids.customer_id = customer.customer_id a nie customer_ids.customer_id)

Bez ORDER BY mysql pobrał pierwsze 10 identyfikatorów typu 10 (zindeksowanych), wyszukał ich klienta i skończył. (Zauważ, że LEFT JOIN tutaj jest tak naprawdę INNER JOIN, ponieważ warunki łączenia będą obowiązywać tylko dla wierszy, które pasują do obu tabel)

Z ORDER BY mysql prawdopodobnie pobiera wszystkie type=10 klientów, a następnie sortując ich według imion, aby znaleźć pierwszych 10.

Możesz to przyspieszyć, denormalizując tabelę klientów (skopiuj typ do rekordu klienta) lub tworząc tabelę mapowania do przechowywania customer_id, name, type krotki. W obu przypadkach dodaj indeks do (type, name) . Jeśli używasz tabeli mapowania, użyj jej do połączenia trójstronnego z klientami i identyfikatorami.

Jeśli typ=10 jest dość powszechny, możesz również wymusić, aby zapytanie przechodziło po tabeli klientów według nazwy i sprawdzało typ każdego z nich za pomocą STRAIGHT JOIN. Nie będzie tak szybki jak indeks złożony, ale będzie szybszy niż zbieranie wszystkich dopasowań.

Jak zasugerowano powyżej, uruchom polecenie EXPLAIN w swoim zapytaniu, aby zobaczyć plan zapytania, którego używa mysql.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wygeneruj wiersz tabeli z wartościami <td> z DB PHP

  2. ustaw wartość początkową automatycznej inkrementacji dla tabeli mysql

  3. jak stworzyć pole obliczeniowe w mysql?

  4. Jak używać zmiennych w klauzuli WHERE w zapytaniu SQL SELECT

  5. Konfiguracje wielu centrów danych przy użyciu klastra Galera dla MySQL lub MariaDB