2012-04-03 17 views
5

Tôi đang sử dụng truy vấn MySQL đơn giản, nhưng hiệu suất thực sự là xấu vì sử dụng ORDER BY. Tôi không thể tìm ra lý do tại sao MySQL đang sử dụng filesort và tạm thời.Truy vấn MySQL bằng cách sử dụng filesort và tạm thời

truy vấn của tôi là:

EXPLAIN 
SELECT * FROM Events 
INNER JOIN EventLogFiles ON ServerID = 42 
AND Events.LogFileID = EventLogFiles.LogFileID 
ORDER BY ReportID DESC , TimeWritten DESC 
LIMIT 100 

Đây là sản phẩm của GIẢI THÍCH:

Mysql EXPLAIN output

Bảng Sự kiện cấu trúc

Table Events structure

Bảng Sự kiện chỉ số

Table Events indexes

Bảng EventLogFiles cấu trúc

Table EventLogFiles structure

Bảng EventLogFiles chỉ số

Table EventLogFiles indexes

UPDATE:

tôi đã cố gắng để tạo ra hai mới các chỉ mục, nhưng cả hai vẫn buộc MySQL sử dụng filesort và tạm thời.

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

Bạn có thể xuất 100 bản ghi đầu tiên vào một bảng tạm thời không có thứ tự, sau đó chỉ đặt 100 bản ghi đó với một truy vấn khác không? –

+1

Thêm Events.LogFileID vào chỉ mục nhiều cột. –

+0

Bạn có thể thử tạo các chỉ mục 'ServerID_ReportID_TimeWritten_LogFileID',' ReportID_TimeWritten_ServerID_LogFileID' không? Tôi nghĩ một trong số họ sẽ giúp. –

Trả lời

4

Để sử dụng các chỉ số cho cả hai lựa chọn và sắp xếp, bạn cần phải có tất cả các cột sau đây trong một chỉ số nhiều cột trên sự kiện: (ServerID, LogFileID, ReportID, TimeWritten).

Hiện tại, MySQL không thể sử dụng chỉ mục nhiều cột hiện tại vì nó không bao gồm LogFileID, nằm trong mệnh đề ON của bạn.

Nếu bạn gặp sự cố khi MySQL đang chọn từ EventLogFiles trước, bạn có thể thay đổi INNER JOIN thành STRAIGHT JOIN để đảm bảo rằng MySQL luôn chọn từ Sự kiện trước, sử dụng chỉ mục của bạn.

+0

Marcus, tôi theo lời khuyên của bạn, nhưng vẫn còn cùng một vấn đề, bạn có bất kỳ ý tưởng? Khoá: ServerID_LogFileID_ReportID_TimeWritten | key_len: 4 | Thêm: Sử dụng tạm thời; Sử dụng filesort – koen

+0

Key_len không thể là 4 cho chỉ mục đa cột. Nó phải là 16. Tôi sẽ kiểm tra lại truy vấn và chỉ mục của bạn. –

0

Để nhận được rằng làm việc mà không bảng temp và tập tin sắp xếp, bạn phải tạo ra một chỉ số (ServerID, LogFileID, ReportID)TimeWritten phải được tuần tự như auto_increment mà bạn đã được sử dụng trong ReportID, vì vậy làm cho ORDER BY ReportID(PK - Order Physical) bạn phải loại bỏ các filesort .

Các vấn đề liên quan