sql >> Database >  >> RDS >> Mysql

MySQL met JOIN gebruikt geen index

Ik weet niet welk verschil je ziet in je vorige en huidige installaties, maar het gedrag van de server is logisch.

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 deze query heb je geen waar-clausule, maar je haalt slechts één rij op. En dat is na sorteren op create_time die toevallig een index heeft. En die index kan worden gebruikt om te sorteren. Maar laten we de tweede vraag eens bekijken.

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

U heeft geen index in de basiskolom. Daar kan dus geen index op worden gebruikt. Om de relevante records te vinden, moet mysql een tabelscan uitvoeren. Nadat de relevante rijen zijn geïdentificeerd, moeten ze worden gesorteerd. Maar in dit geval heeft de queryplanner besloten dat het gewoon niet de moeite waard is om de index op create_time te gebruiken

Ik zie verschillende problemen met je setup, de eerste is dat je geen en index hebt op base zoals al genoemd. Maar waarom is base varchar? Je lijkt er gehele getallen in op te slaan.

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

En het maken van meerdere indexen zoals deze heeft niet veel zin in mysql. Dat komt omdat mysql slechts één index per tabel kan gebruiken voor query's. Je zou veel beter af zijn met een of twee indexen. Mogelijk indexen met meerdere kolommen.

Ik denk dat je ideale index zowel create_time- als eventvelden zou bevatten



  1. Laravel Database Strikte modus

  2. Functie of procedure voor een IN-clausule

  3. Databases migreren naar uw resellerserver

  4. oracle binaire gegevenstypen