2012-04-03 11 views
5

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

Mysql EXPLAIN output

Tabela Zdarzenia

Table Events structure

Tabela wydarzenia indeksy

Table Events indexes

EventLogFiles Tabela Struktura

Table EventLogFiles structure

EventLogFiles Tabela indeksy

Table EventLogFiles indexes

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) 
+1

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? –

+1

Dodaj Events.LogFileID do indeksu wielu kolumn. –

+0

Czy możesz spróbować utworzyć indeksy 'ServerID_ReportID_TimeWritten_LogFileID',' ReportID_TimeWritten_ServerID_LogFileID'? Myślę, że jeden z nich pomoże. –

Odpowiedz

4

W celu wykorzystania indeksu zarówno dla selekcji i sortowania, trzeba mieć wszystkie z następujących kolumn w indeksie multi-kolumnowej na Wydarzenia: (ServerID, LogFileID, ReportID, TimeWritten).

Obecnie MySQL nie można wykorzystać istniejący indeks wielu kolumn, ponieważ nie obejmują LogFileID, która jest w klauzuli ON.

Jeśli kiedykolwiek mieć problemy gdzie MySQL jest wybranie z EventLogFiles pierwsze, można zmienić INNER JOIN do STRAIGHT JOIN aby upewnić się, że MySQL zawsze wybiera ze Wydarzenia pierwsze, za pomocą indeksu.

+0

Marcus, ja po poradę, ale nadal ten sam problem, macie jakieś pomysły? Klucz: ServerID_LogFileID_ReportID_TimeWritten | key_len: 4 | Dodatkowe: Korzystanie z tymczasowego; Używanie fileorta – koen

+0

Key_len nie może być 4 dla indeksu wielu kolumn. Powinno być 16. Dokładnie sprawdziłbym twoje zapytanie i indeks. –

0

W celu uzyskania że działa bez tabeli temp i plików sortowania, należy utworzyć indeks (ServerID, LogFileID, ReportID) i TimeWritten moszczu być sekwencyjna jak auto_increment które zostały z wykorzystaniem w ReportID, tak czyniąc ORDER BY ReportID(PK - Order Physical) trzeba usunąć filesort .

Powiązane problemy