2010-02-19 37 views
7

Gần đây tôi đã nhận được MySQL để treo trên các truy vấn cụ thể. Tôi có một bảng với hơn 500.000 hồ sơ. Dưới đây là các truy vấn được chạy:Kết quả phân loại MySQL mất một thời gian dài

SELECT * FROM items WHERE (itemlist_id = 115.626) ORDER BY tableOrder DESC LIMIT 1

Sau đây là giải thích:

| 1 | SIMPLE | mục | TẤT CẢ | NULL | NULL | NULL | NULL | 587113 | Sử dụng ở đâu; Sử dụng filesort |

Và đây là sự xâm nhập process_list:

| 252996 | root | localhost | itemdb | Truy vấn | 0 | Sắp xếp kết quả | CHỌN * TỪ items WHERE (itemlist_id = 115642) ORDER BY tableOrder DESC LIMIT 1 |

Bất kỳ ý tưởng nào có thể khiến cho truy vấn này mất 10 phút để xử lý? Khi tôi chạy nó bằng tay nó được thực hiện một cách nhanh chóng. (1 dòng trong set (0.86 giây))

Cảm ơn

+1

Bạn có chắc đó là cách sắp xếp chậm và không tìm thấy bản ghi? Nếu bạn đã có một bảng quét 500k + hồ sơ trên một lĩnh vực mà không được lập chỉ mục nó có thể mất một lúc. Và sự "nhanh chóng" thủ công có thể là do MySQL (hoặc hệ điều hành) đã được lưu trữ trong dữ liệu từ một nỗ lực trước đó và chạy nhanh hơn nhiều. –

Trả lời

6

Bạn cần phải tạo một chỉ mục trên items (itemList_id, TableOrder) và viết lại truy vấn một chút:

SELECT * 
FROM items 
WHERE itemlist_id = 115626 
ORDER BY 
     itemlist_id DESC, tableOrder DESC 
LIMIT 1 

Điều kiện đầu tiên trong ORDER BY thể dường như là dư thừa, nhưng nó giúp MySQL để chọn gói đúng (không sắp xếp).

+0

Cảm ơn! Tôi đã thêm chỉ mục và truy vấn, và bây giờ nó nhanh chóng rực rỡ. –

+0

bạn có thể vui lòng cung cấp tài nguyên cho bản chỉnh sửa bạn đã thực hiện cho truy vấn không. điều rất quan trọng là phải hiểu tại sao đối với tôi. – TDSii

+1

@TDSii: Tôi đã thực hiện chỉnh sửa dựa trên tài liệu 'MySQL' và trải nghiệm của mình. – Quassnoi

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