Używam prostego zapytania MySQL, ale wydajność jest naprawdę zła z powodu użycia ORDER BY. Nie mogę zrozumieć, dlaczego MySQL używa pliku filesort i tymczasowego.Zapytanie MySQL przy użyciu fileort i tymczasowego
My zapytanie jest:
EXPLAIN
SELECT * FROM Events
INNER JOIN EventLogFiles ON ServerID = 42
AND Events.LogFileID = EventLogFiles.LogFileID
ORDER BY ReportID DESC , TimeWritten DESC
LIMIT 100
To wyjście wyjaśniania Struktura
Tabela Zdarzenia
Tabela wydarzenia indeksy
EventLogFiles Tabela Struktura
EventLogFiles Tabela indeksy
UPDATE:
że próbuje utworzyć dwa nowe indeksy, ale obie wciąż zmuszają MySQL do używania filesort i temporary.
ALTER TABLE Events ADD INDEX `ReportID_TimeWritten_ServerID_LogFileID` (ReportID DESC, TimeWritten DESC, ServerID, LogFileID)
ALTER TABLE Events ADD INDEX `ServerID_LogFileID_ReportID_TimeWritten` (ServerID, LogFileID, ReportID DESC, TimeWritten DESC)
Czy możesz wydrukować pierwszych 100 rekordów w tabeli tymczasowej bez zamawiania, a następnie zamówić tylko te 100 rekordów z innym zapytaniem? –
Dodaj Events.LogFileID do indeksu wielu kolumn. –
Czy możesz spróbować utworzyć indeksy 'ServerID_ReportID_TimeWritten_LogFileID',' ReportID_TimeWritten_ServerID_LogFileID'? Myślę, że jeden z nich pomoże. –