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

MySQL z JOIN nie używa indeksu

Nie wiem, jaką różnicę obserwujesz w poprzednich i obecnych instalacjach, ale zachowanie serwerów ma sens.

SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id )  ORDER BY  test_events.create_time DESC LIMIT 1; 

W tym zapytaniu nie masz klauzuli where, ale pobierasz tylko jeden wiersz. I to po sortowaniu według create_time który ma indeks. I ten indeks można wykorzystać do sortowania. Zobaczmy jednak drugie zapytanie.

SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id ) WHERE base = 314 ORDER BY  test_events.create_time DESC LIMIT 1

Nie masz indeksu w kolumnie podstawowej. Więc żaden indeks nie może być użyty do tego. Aby znaleźć odpowiednie rekordy, mysql musi wykonać skanowanie tabeli. Po zidentyfikowaniu odpowiednich wierszy należy je posortować. Ale w tym przypadku planista zapytań zdecydował, że po prostu nie warto używać indeksu w create_time

Widzę kilka problemów z twoją konfiguracją, z których pierwszym jest brak indeksowania w base jak już wspomniano. Ale dlaczego bazowy varchar? Wygląda na to, że przechowujesz w nim liczby całkowite.

ALTER TABLE test_events
  ADD PRIMARY KEY (id),
  ADD KEY client (client),
  ADD KEY event_time (event_time),
  ADD KEY manager (manager),
  ADD KEY base_id (base_id),
  ADD KEY create_time (create_time);

A tworzenie wielu indeksów w ten sposób nie ma większego sensu w mysql. To dlatego, że mysql może używać tylko jednego indeksu na tabelę dla zapytań. Byłoby znacznie lepiej z jednym lub dwoma indeksami. Prawdopodobnie indeksy wielokolumnowe.

Myślę, że Twój idealny indeks zawierałby zarówno pola create_time, jak i zdarzenia



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO::FETCH_ASSOC nie pobiera wszystkiego

  2. Wyślij plik z listonoszem do Laravel API

  3. Aktualizacja kolumny o COUNT innych pól to SQL?

  4. Prawda/Fałsz kontra 0/1 w MySQL

  5. Instalowanie MySQLdb w systemie Snow Leopard