Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL con JOIN che non utilizza index

Non so la differenza che stai vedendo nelle tue installazioni precedenti e attuali, ma il comportamento dei server ha senso.

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; 

In questa query non hai una clausola where ma stai recuperando solo una riga. E questo dopo l'ordinamento per create_time che ha un indice. E quell'indice può essere utilizzato per l'ordinamento. Ma vediamo la seconda query.

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

Non hai un indice nella colonna di base. Quindi nessun indice può essere utilizzato su questo. Per trovare i record pertinenti mysql deve eseguire una scansione della tabella. Dopo aver identificato le righe pertinenti, è necessario ordinarle. Ma in questo caso il pianificatore di query ha deciso che non vale la pena utilizzare l'indice su create_time

Vedo diversi problemi con la tua configurazione, il primo è non avere e indicizzare su base come già detto. Ma perché la base varchar? Sembra che tu stia memorizzando numeri interi al suo interno.

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);

E creare più indici come questo non ha molto senso in MySQL. Questo perché mysql può utilizzare solo un indice per tabella per le query. Saresti molto meglio con uno o due indici. Possibilmente indici a più colonne.

Penso che il tuo indice ideale conterrebbe sia i campi create_time che quelli dell'evento