2009-08-15 7 views
5

Khi tôi quyết định sử dụng OR/M (Entity Framework cho MySQL lần này) cho dự án mới của tôi, tôi hy vọng nó sẽ tiết kiệm thời gian cho tôi, nhưng dường như tôi đã thất bại (lần thứ hai).Entity Framework + MySQL - Tại sao hiệu suất lại khủng khiếp như vậy?

Hãy truy vấn này SQL đơn giản

SELECT * FROM POST ORDER BY addedOn DESC LIMIT 0, 50 

Nó thực hiện và mang lại cho tôi kết quả trong vòng chưa đầy một giây như mong muốn (bảng có khoảng 60.000 dòng).

Đây là LINQ tương đương to Entities truy vấn mà tôi đã viết cho

này
var q = (from p in db.post 
      orderby p.addedOn descending 
      select p).Take(50); 

    var q1 = q.ToList(); //This is where the query is fetched and timed out 

Nhưng truy vấn này không bao giờ thậm chí thực hiện nó lần ra LUÔN (không orderby phải mất 5 giây để chạy)! Thời gian chờ của tôi được đặt thành 12 giây để bạn có thể tưởng tượng thời gian chờ nhiều hơn thế.

  • Tại sao điều này xảy ra?
  • Có cách nào tôi có thể thấy Truy vấn SQL thực tế mà Khung thực thể đang gửi tới db không?
  • Tôi có nên từ bỏ EF + MySQL và chuyển sang SQL chuẩn trước khi tôi mất tất cả vĩnh cửu để làm cho nó hoạt động không?

Tôi đã được tái kiểm định chỉ số của tôi, cố gắng tải háo hức (mà thực sự làm cho nó thất bại ngay cả khi không mệnh đề orderby)

Hãy giúp đỡ, tôi sắp bỏ HOẶC/M cho MySQL như một mất nguyên nhân.

+1

Vâng, tôi đã từ bỏ và loại bỏ EF + MySQL –

Trả lời

4

Tất cả các nghiên cứu của tôi cuối cùng đã lên đến kết luận rằng trong khi EF nói chung là xấu cho hiệu suất, MySql + EF là hết sức kém chất lượng. Lựa chọn của L2 của L2S trên EF là một động thái tốt và nếu tôi có quyền truy cập vào cơ sở dữ liệu MS Sql thay vì MySQL, tôi cũng đã di chuyển theo hướng đó.

Thật không may là tôi bị kẹt với MySql khiến nó miễn phí và điều đó đã buộc tôi từ bỏ EF. Bây giờ tôi đã trở lại với các câu lệnh SQL khó mã hóa của mình theo cách cũ, được thử nghiệm, hiệu quả và kết quả là tốt.

Tôi đã chuyển MYSql + EF, nhưng tôi rất thích nghe từ những người đã sử dụng thành công nó trong một dự án không tầm thường.

+0

cùng một vấn đề, bởi vì SQL được tạo ra không tốt, hãy xem: http://stackoverflow.com/questions/3344493/limiting-query-size-with-entity- khung –

+1

xin lỗi URL là sai http://stackoverflow.com/questions/14191998/linq-to-entity-linq-query-performance-optimization/14192078 –

2

Tôi nghĩ bước đầu tiên sẽ tìm ra câu lệnh SQL nào được gửi tới MySQL. This bài viết giải thích cách bật ghi nhật ký trong MySQL. Nếu có thể bạn có thể muốn xem liệu .NET 4.0 beta 1 có cải thiện SQL được tạo hay không.

+0

.Net 4 không liên quan gì đến điều này. Tôi cho rằng đó là nhà cung cấp MySQL Entity Framework. –

+1

Những gì tôi đã nhận được là nếu SQL thực sự xấu được tạo ra có thể với .NET 4.0 bạn có thể thấy những cải tiến. Nhưng trước hết, hãy xem những gì đang được gửi tới MySQL. –

+2

Không có nhà cung cấp tích hợp cho MySQL, vì vậy .NET 4 sẽ không thay đổi một điều: P Tôi đoán là '.Take()' được thực hiện phía máy khách thay vì được dịch sang 'LIMIT'. – Thorarin

0

Bạn cũng có thể lấy SQL từ nhà cung cấp EF qua ToTraceString.

+0

Tôi muốn đăng bài này dưới dạng bình luận lên pubb câu trả lời, thực sự. Cho tín dụng cho anh ta, không phải tôi. :) –

+0

sql giống như 'select * from (select * from post) orderby addedOn desc limit 0,20', xin xem cái này, về cơ bản nó giống như câu hỏi: http://stackoverflow.com/questions/14191998/linq-to -entity-linq-query-performance-optimization/14192078 # 14192078 –

1

tôi đã sử dụng thành công MySql với LINQ to SQL, sử dụng dự án mã nguồn mở DBLinq. Tôi biết khung Entity không phải của nó nhưng các mô hình probramming rất quen thuộc. Hy vọng điều này sẽ giúp bất cứ ai!