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