Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL mit JOIN verwendet keinen Index

Ich weiß nicht, welchen Unterschied Sie in Ihren vorherigen und aktuellen Installationen sehen, aber das Serververhalten macht Sinn.

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 dieser Abfrage haben Sie keine Where-Klausel, sondern Sie rufen nur eine Zeile ab. Und das nach der Sortierung nach create_time die zufällig einen Index hat. Und dieser Index kann zum Sortieren verwendet werden. Aber sehen wir uns die zweite Abfrage an.

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

Sie haben keinen Index für die Basisspalte. Daher kann kein Index darauf verwendet werden. Um die relevanten Datensätze zu finden, muss mysql einen Tabellenscan durchführen. Nachdem die relevanten Zeilen identifiziert wurden, müssen sie sortiert werden. Aber in diesem Fall hat der Abfrageplaner entschieden, dass es sich einfach nicht lohnt, den Index auf create_time zu verwenden

Ich sehe mehrere Probleme mit Ihrem Setup, das erste ist, dass Sie keinen Index auf base haben wie bereits erwähnt. Aber warum ist Base Varchar? Sie scheinen Integer darin zu speichern.

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

Und das Erstellen mehrerer Indizes wie diesem macht in MySQL nicht viel Sinn. Das liegt daran, dass mysql nur einen Index pro Tabelle für Abfragen verwenden kann. Sie wären mit ein oder zwei Indizes viel besser dran. Möglicherweise mehrspaltige Indizes.

Ich denke, Ihr idealer Index würde sowohl create_time- als auch event-Felder enthalten