2011-06-23 26 views
9

Tôi đang xử lý biểu mẫu có nhiều trường cho người dùng đang chỉnh sửa bản ghi hiện có. người dùng có thể chỉ thay đổi một trường, và tôi thường làm một truy vấn cập nhật để đặt giá trị của tất cả các trường, mặc dù hầu hết chúng không thay đổi. tôi có thể thực hiện một số loại theo dõi để xem những trường nào đã thực sự thay đổi và chỉ cập nhật vài trường đã thực hiện. sao có sự khác biệt hiệu suất giữa việc cập nhật tất cả các trường trong một bản ghi so với chỉ một trường đã thay đổi? có lý do nào khác để đi với một trong hai phương pháp? phương pháp shotgun khá dễ dàng ...(My): Cập nhật một trường và nhiều trường không cần thiết

+0

Tôi quan tâm đến câu trả lời liên quan đến hiệu suất cụ thể. Tuy nhiên, tôi nghĩ bạn tự nói - * phương pháp shotgun khá dễ dàng *. Đó là để nói, IMO, bất cứ điều gì tối ưu hóa bản cập nhật lĩnh vực duy nhất có thể cung cấp, là nó * giá trị * chi phí của việc theo dõi. Hiệu suất là một sự cân bằng. –

+3

MySQL sẽ phát hiện nếu một trường không thay đổi và không thực hiện thêm bất kỳ công việc nào trên đó, do đó, chi phí không phải là xấu như bạn nghĩ. – Johan

+0

cảm ơn, mọi người. – changokun

Trả lời

7

tôi sẽ nói rằng nó phụ thuộc vào những điều sau đây:

  • Kích thước của dữ liệu mà đang được xử lý
  • Vị trí của máy chủ cơ sở dữ liệu liên quan đến việc áp dụng
  • Thời gian cần thiết để hoàn thành bất kỳ séc nào để thay đổi dữ liệu

Nếu bạn đang chuyển số tiền lớn dữ liệu và/hoặc kết nối là điều khiển từ xa thì bạn nên thực hiện một số kiểm tra để xem liệu bạn có thể cải thiện hiệu suất bằng cách theo dõi thay đổi hay không. Nếu không, có thể bạn sẽ thấy rằng nó là không đáng kể khi cho rằng một bản ghi đang được thao tác.

1

Tất nhiên sẽ có một số chi phí trong việc cập nhật nhiều trường, nhưng chi phí sẽ nhỏ hơn chi phí duy trì trạng thái về trường nào đã thay đổi. Nếu đây là 1 bảng, tôi sẽ không lo lắng về việc cập nhật có chọn lọc các cột dựa trên trạng thái của biểu mẫu của bạn.

Ngoài ra, có thể hữu ích khi xem xét một khung cơ sở dữ liệu như Hibernate để tóm tắt một số chi tiết này.

0

Tôi sẽ đi cho quảng cáo phương pháp shotgun dễ hiểu và thực hiện. Các hit hiệu suất nên được bỏ qua.

2

Nếu bạn đang nói về một lượng dữ liệu hợp lý (ví dụ: 1kb +) thì việc tối ưu hóa có thể đáng giá. Nếu câu lệnh/bảng này đang được chạy/cập nhật thường xuyên (nhiều lần trong một giây?), Bởi nhiều người dùng, v.v ... nó có thể đáng được tối ưu hóa.

Bạn đã có bản sao dữ liệu gốc, do đó, tìm hiểu những gì đã thay đổi không phải là vấn đề lớn và không thay đổi câu lệnh cập nhật để chỉ chứa các trường đã thay đổi.

Vì vậy, nó có thể không phải là một ý tưởng tồi, nhưng trừ khi bạn đang tìm cách để tiết kiệm băng thông, hoặc cảm thấy bạn cần phải cải thiện hiệu suất, nó có lẽ không cần thiết.

3

Tôi muốn nói đi cho shotgun nhưng nó thực sự phụ thuộc vào nhiều điều và sử dụng bạn có trên db.

  • Một người dùng hoặc hàng triệu người dùng đồng thời?
  • Các trường có nhỏ hoặc có các trường văn bản/blob lớn không?
  • Ứng dụng có biểu mẫu được điền gần db hoặc thông qua mạng hoặc web không?

Bạn cần phải đưa vào tài khoản mà UPDATE sẽ phải không chỉ lưu trữ mới (ngay cả những người không thay đổi) các trường vào bảng mà còn:

  • kiểm tra ràng buộc khoá ngoại
  • cập nhật tất cả các chỉ mục trên các trường được cập nhật

Tuy nhiên, bạn có thể thực hiện một cách dễ dàng và kiểm tra bất kỳ vấn đề hiệu suất nào an toàn.

1

Bạn thực sự có thể mất hiệu suất chỉ bằng cách cập nhật các trường đơn lẻ. Nếu bạn đang sử dụng các câu lệnh đã chuẩn bị, thì cơ sở dữ liệu đã biên soạn kế hoạch truy vấn để cập nhật tất cả các trường. Nếu bạn bắt đầu cập nhật các trường ngẫu nhiên, thì bạn sẽ phải phân tích truy vấn mỗi khi bạn cập nhật, mất lợi ích của các câu lệnh đã chuẩn bị. Tôi không chắc chắn bao nhiêu hiệu ứng này sẽ có trong MySQL, nhưng tôi biết nó có thể có ý nghĩa với SQL Server và Oracle.

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