2009-05-19 31 views
16

Dưới đây là các truy vấn (bảng lớn nhất có khoảng 40.000 dòng)chậm truy vấn khi sử dụng ORDER BY

SELECT 
    Course.CourseID, 
    Course.Description, 
    UserCourse.UserID, 
    UserCourse.TimeAllowed, 
    UserCourse.CreatedOn, 
    UserCourse.PassedOn, 
    UserCourse.IssuedOn, 
    C.LessonCnt 
FROM 
    UserCourse 
INNER JOIN 
    Course 
USING(CourseID) 
INNER JOIN 
(
    SELECT CourseID, COUNT(*) AS LessonCnt FROM CourseSection GROUP BY CourseID 
) C 
USING(CourseID) 
WHERE 
    UserCourse.UserID = 8810 

Nếu tôi chạy này, nó thực hiện rất nhanh chóng (0,05 giây xấp xỉ). Nó trả về 13 hàng.

Khi tôi thêm mệnh đề ORDER BY vào cuối truy vấn (sắp xếp theo bất kỳ cột nào), truy vấn mất khoảng 10 giây.

Tôi đang sử dụng cơ sở dữ liệu này trong sản xuất ngay bây giờ và mọi thứ đang hoạt động tốt. Tất cả các truy vấn khác của tôi đều nhanh chóng.

Bất kỳ ý tưởng nào về nó có thể là gì? Tôi chạy truy vấn trong Trình duyệt truy vấn của MySQL và từ dòng lệnh. Cả hai nơi nó đã chết chậm với ORDER BY.

EDIT: Tolgahan giải pháp ALBAYRAK hoạt động, nhưng bất cứ ai cũng có thể giải thích lý do tại sao nó hoạt động?

+0

Tại sao lại hoạt động? một truy vấn phụ có kết quả trong một tập kết quả và việc đặt hàng một tập kết quả nhanh hơn nhiều so với việc thực hiện truy vấn mặc định có tính theo thứ tự trên đường đi. –

Trả lời

15

có lẽ đây sẽ giúp:

SELECT * FROM ( 
    SELECT 
     Course.CourseID, 
     Course.Description, 
     UserCourse.UserID, 
     UserCourse.TimeAllowed, 
     UserCourse.CreatedOn, 
     UserCourse.PassedOn, 
     UserCourse.IssuedOn, 
     C.LessonCnt 
    FROM 
     UserCourse 
    INNER JOIN 
     Course 
    USING(CourseID) 
    INNER JOIN 
    (
     SELECT CourseID, COUNT(*) AS LessonCnt FROM CourseSection GROUP BY CourseID 
    ) C 
    USING(CourseID) 
    WHERE 
     UserCourse.UserID = 8810 
) ORDER BY CourseID 
+0

Huh, hoạt động (làm cho nó hoạt động nhanh). Bạn có biết tại sao không? Tôi chưa bao giờ phải làm điều đó trước đây. –

+0

40k không phải là nhiều bản ghi; thường phải đối phó với hàng triệu mileage đậu nành có thể khác nhau nhưng điều này có thể giúp cải thiện hiệu suất hơn nữa về điều này như là tham gia sẽ được thực hiện trên một tập dữ liệu giảm. ... TỪ (Chọn * từ UserCourse Trường hợp UserID = 8810 ) UserCourse – u07ch

+0

@Dude - tốc độ chậm đi kèm vì có thể chọn thực hiện việc đặt hàng trước khi tham gia. Làm theo thứ tự bởi trong một truy vấn bên ngoài buộc nó chỉ đặt hàng các mục đã chọn. – tvanfosson

6

Cột bạn đang sắp xếp theo chỉ mục chưa?

Lập chỉ mục tăng tốc độ sắp xếp và lọc mạnh mẽ.

+0

op được đề cập bằng cách sử dụng bất kỳ cột nào theo thứ tự bằng cách giảm hiệu suất – northpole

+1

Bất kỳ cột nào, kể cả các cột được lập chỉ mục, làm cho cột chạy chậm. –

0

Bạn đã cập nhật số liệu thống kê trên cơ sở dữ liệu của bạn? Tôi chạy vào một cái gì đó tương tự trên tôi, nơi tôi đã có 2 truy vấn giống nhau, nơi sự khác biệt duy nhất là một bức thư vốn và một trở lại trong 1/2 một giây và khác mất gần 5 phút. Cập nhật số liệu thống kê giải quyết vấn đề

0

Một câu hỏi tương tự đã được hỏi trước khi here.

Nó có thể giúp bạn là tốt. Về cơ bản nó mô tả bằng cách sử dụng các chỉ mục tổng hợp và cách thức hoạt động của các công trình.

0

Hôm nay tôi đã chạy vào cùng một loại vấn đề. Ngay sau khi tôi sắp xếp kết quả bởi một trường từ một bảng đã nối, toàn bộ truy vấn chậm và khủng khiếp mất hơn một trăm giây.

Máy chủ đang chạy MySQL 5.0.51a và tình cờ tôi nhận thấy rằng cùng một truy vấn đang chạy nhanh như nó phải luôn luôn được thực hiện trên máy chủ với MySQL 5.1. Khi so sánh giải thích cho truy vấn đó tôi thấy rõ ràng việc sử dụng và xử lý các chỉ mục đã thay đổi rất nhiều (ít nhất là từ 5.0 -> 5.1).

Vì vậy, nếu bạn gặp một vấn đề như vậy, có thể giải quyết của bạn là chỉ cần nâng cấp MySQL của bạn

1

Nhận ra câu trả lời là quá muộn, tuy nhiên tôi vừa có một vấn đề tương tự, thêm trật tự bằng cách tăng thời gian truy vấn từ vài giây đến 5 phút và đã thử hầu hết các gợi ý khác để tăng tốc nó, nhận thấy rằng các tập tin/tmp nơi nhận được 12G cho truy vấn này. Thay đổi truy vấn sao cho một trường varchar (20000) được trả lại là "trim (" ed và hiệu năng được cải thiện đáng kể (trở lại giây). Vì vậy, tôi đoán giá trị của nó kiểm tra xem bạn có trả lại các varchars lớn như một phần của truy vấn của bạn không và nếu có, xử lý chúng (có thể là chuỗi con (x, 1, length (x)) ?? nếu bạn không muốn cắt chúng Truy vấn đã trả về 500 nghìn hàng và tệp/tmp chỉ ra rằng mỗi hàng đã sử dụng khoảng 20k dữ liệu.

1

Bạn đang chọn từ "UserCourse" mà tôi giả định là một bảng nối giữa các khóa học và người dùng (Nhiều người đến Nhiều). Bạn nên lập chỉ mục cột mà bạn cần đặt hàng, trong bảng "UserCourse".

Giả sử bạn muốn "đơn đặt hàng theo CourseID", sau đó bạn cần lập chỉ mục trên bảng UserCourse.

Việc sắp xếp theo bất kỳ cột nào khác không có trong bảng kết nối (ví dụ: UserCourse) có thể yêu cầu chuẩn hóa thêm và lập chỉ mục trên bảng nối để được tối ưu hóa cho tốc độ; Nói cách khác, bạn cần có một bản sao của cột đó trong bảng nối và lập chỉ mục nó.

P.S. Câu trả lời được đưa ra bởi Tolgahan Albayrak, mặc dù chính xác cho câu hỏi này, sẽ không tạo ra kết quả mong muốn, trong trường hợp một người đang thực hiện truy vấn "LIMIT x".

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