2012-05-03 37 views
7

Tôi có cơ sở dữ liệu với bảng 'phiếu bầu' của người dùng và bảng 'người dùng'. Tôi nghĩ rằng cơ sở dữ liệu sẽ nhận được khá lớn trong một khoảng thời gian ngắn vì vậy tôi muốn sử dụng phương pháp hiệu quả nhất.COUNT() hoạt động mỗi lần, hoặc lưu trữ giá trị và tăng giá trị một lần?

Tôi nghĩ tôi có thể COUNT() số phiếu bầu với câu WHERE từ bảng 'phiếu bầu' mỗi lần hoặc tôi có thể lưu trữ điểm trong bảng 'người dùng' và chỉ tăng số điểm lên 1 mỗi thời gian bỏ phiếu được thêm vào.

Điều gì sẽ là tốt nhất/nhanh nhất và/hoặc có cách nào khác để thực hiện việc này không?

Trả lời

2

Nếu bạn đang nghĩ đến cách tốt nhất để làm điều đó. Bạn phải nhìn vào tối ưu hóa và bộ nhớ đệm rất nhiều.

Tôi có thể nói, Tạo cột trên bảng người dùng để lưu trữ điểm được lưu trong bộ nhớ cache, nhưng duy trì điểm số trên bảng riêng biệt.

Bất cứ khi nào thay đổi điểm hoạt động của bảng điểm và kích hoạt cập nhật trên bảng của người dùng với kết quả điểm số mới nhất.

Làm điều này, bạn có khả năng mở rộng trong dữ liệu điểm số của bạn, giống như những gì stackoverflow sử dụng cho phiếu bầu.

+0

"_Tạo một cột trên bảng người dùng để lưu trữ score_ được lưu trữ_" Bạn có nghĩa là công cụ DB sẽ lưu trữ nó chứ không phải lập trình viên? –

+0

@ Mr.TAMER, tôi xin lỗi, nhưng tôi không hiểu bạn ngụ ý bởi thuật ngữ "không phải là lập trình viên" – Starx

2

Trong cấu hình đúng (cấu hình mặc định đủ tốt trong hầu hết các trường hợp) máy chủ MySQL 5.0+ đang lưu vào bộ nhớ cache SUM, COUNT truy vấn, do đó, MySQL đang xử lý loại truy vấn đó tự động.

Nhưng nếu bạn đang sử dụng phiên bản cũ hơn (MySQL 4 trở xuống), tôi khuyên bạn nên lưu trữ COUNT (*) giá trị trong cơ sở dữ liệu, bởi vì nó thực sự gây ra hiệu ứng trên bảng lớn hơn.

Chỉnh sửa: Thực tiễn tốt nhất mà tôi phát hiện là thực hiện truy vấn COUNT (*) mỗi khi người dùng thêm/xóa bỏ phiếu/nhận xét v.v. Các máy chủ SQL hiện đại đang xử lý truy vấn nhóm rất tốt, vì vậy chúng tôi không phải bận tâm về perfomance.

+0

Có bất kỳ kết quả sai nào nếu COUNT thay đổi quá nhiều không? –

+0

IMO Phương pháp hay nhất là thực hiện truy vấn COUNT (*) mỗi lần người dùng thêm/xóa bỏ phiếu/nhận xét, v.v. Dù sao các máy chủ SQL hiện đại cũng đang xử lý các truy vấn nhóm rất tốt. – Peter

+0

"MySQL 5.0+ máy chủ đang lưu vào bộ nhớ cache SUM, COUNT truy vấn, vì vậy MySQL tự động xử lý các loại truy vấn đó. "--- giả thiết của bạn dựa trên bộ nhớ cache hay không - phụ thuộc vào ** rất nhiều ** tiêu chí – zerkms

0

Tính toán trước là một trong các tối ưu hóa thường không chuẩn hóa.

Vì vậy, chỉ cần tạo cột được tính toán trước và duy trì cột đó bằng trình kích hoạt hoặc mã ứng dụng của bạn.

Như @Bohemian đã chỉ ra: bạn cần thực hiện điều đó chỉ nếu bạn gặp sự cố về hiệu suất.

+0

+! Đây là những gì tôi muốn làm, nhưng chỉ khi hiệu suất trở thành một vấn đề. Tối ưu hóa cuối cùng - làm cho nó hoạt động trước tiên. – Bohemian

+0

@Bohemian: đó là những gì tôi giả định trong nền :-) – zerkms

0

Đó là sự cân bằng về chi phí và sự phức tạp. Bằng cách duy trì số lượng trong bảng người dùng, nó thêm một số phức tạp để giữ cho nó chính xác, và nó cho biết thêm chi phí để chèn/xóa phiếu bầu. Nó có nghĩa là thêm một cuộc bỏ phiếu sau đó yêu cầu (ít nhất) cập nhật hai bảng.

Vì vậy, nó phụ thuộc một chút vào phần nào cần hiệu quả nhất. Nếu việc lấy số phiếu bầu được thực hiện một số lần rất lớn, thì có lẽ nó có ý nghĩa để duy trì số lượng.

Theo ý kiến ​​của tôi, tốt hơn hết là nên thực hiện đơn giản hơn trước và giả sử rằng cơ sở dữ liệu sẽ có thể tối ưu hóa truy vấn và làm cho nó không thành vấn đề. Nếu điều đó không đủ nhanh, thì hãy thực hiện các thay đổi để thêm số được tính trước sau.

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