Tôi đang phát triển một dự án tại nơi tôi cần tạo và duy trì Bảng tóm tắt vì lý do hiệu suất. Tôi tin rằng cụm từ chính xác cho điều này là Lượt xem vật chất.Phương thức ưu tiên cho Chế độ xem Vật hoá (Bảng tóm tắt) với MySQL
tôi có 2 lý do chính để làm điều này:
denormalization
tôi bình thường hóa các bảng càng nhiều càng tốt. Vì vậy, có những tình huống mà tôi sẽ phải tham gia nhiều bảng để lấy dữ liệu. Chúng tôi làm việc với MySQL Cluster, có hiệu suất khá kém khi nói đến JOIN.
Vì vậy, tôi cần tạo Bảng không chuẩn hóa có thể chạy nhanh hơn SELECT.
Tóm tắt dữ liệu
Ví dụ, tôi có một bảng giao dịch với một vài triệu bản. Các giao dịch đến từ các trang web khác nhau. Ứng dụng cần tạo báo cáo sẽ hiển thị số lượng giao dịch hàng ngày hoặc hàng tháng và tổng số tiền doanh thu trên mỗi trang web. Tôi không muốn kịch bản báo cáo tính toán điều này mọi lúc, vì vậy tôi cần tạo Bảng tóm tắt sẽ có bảng phân tích theo [trang web, ngày].
Đó chỉ là một ví dụ đơn giản. Có nhiều loại bảng tóm tắt khác nhau mà tôi cần để tạo và duy trì.
Trước đây tôi đã thực hiện những việc này bằng cách viết một số tập lệnh cron để giữ cho mỗi bảng tóm tắt được cập nhật. Nhưng trong dự án mới này, tôi hy vọng sẽ thực hiện một giải pháp thanh lịch và đúng đắn hơn.
Tôi thích một giải pháp dựa trên PHP, vì tôi không phải là quản trị viên máy chủ và tôi cảm thấy thoải mái nhất khi tôi có thể kiểm soát mọi thứ thông qua mã ứng dụng của mình.
Giải pháp mà tôi đã xem xét:
sao chép XEM của
Nếu bảng kết quả có thể được biểu diễn dưới dạng một truy vấn SELECT duy nhất, tôi có thể tạo ra một VIEW . Vì chúng chậm, có thể có một cronjob sao chép VIEW này thành một bảng thực.
Tuy nhiên, một số truy vấn SELECT này có thể chậm đến mức không thể chấp nhận ngay cả đối với cronjobs. Nó không phải là rất hiệu quả để tái tạo toàn bộ dữ liệu tóm tắt, nếu hàng cũ hơn thậm chí không được cập nhật nhiều.
Tuỳ chỉnh cronjobs cho mỗi Tóm tắt Bảng
Đây là giải pháp tôi đã sử dụng trước đó, nhưng bây giờ tôi đang cố gắng để tránh nó nếu có thể. Nếu có nhiều bảng tóm tắt, nó có thể lộn xộn để duy trì.
MySQL Triggers
Có thể thêm trigger cho bảng chính để mỗi khi có một INSERT, UPDATE hay DELETE, các bảng tóm tắt được cập nhật cho phù hợp.
Sẽ không có cronjob và tóm tắt sẽ theo thời gian thực. Tuy nhiên, nếu có nhu cầu xây dựng lại một bảng tóm tắt từ đầu, nó sẽ phải được thực hiện với một giải pháp khác (có thể là # 1 ở trên).
Sử dụng ORM Móc/Triggers
Tôi đang sử dụng học thuyết như ORM của tôi. Có một cách để thêm người nghe sự kiện sẽ kích hoạt công cụ trên INSERT/UPDATE/DELETE, do đó có thể cập nhật các bảng tóm tắt. Theo một nghĩa nào đó, giải pháp này tương tự như # 3 ở trên, nhưng tôi sẽ kiểm soát tốt hơn các trình kích hoạt này vì chúng sẽ được thực hiện trong PHP.
xét triển khai:
Hoàn Tái
Tôi muốn tránh phải xây dựng lại các bảng tóm tắt, cho hiệu quả, và chỉ cập nhật cho dữ liệu mới. Nhưng trong trường hợp có sự cố, tôi cần khả năng xây dựng lại bảng tóm tắt từ đầu bằng cách sử dụng dữ liệu hiện có trên các bảng chính.
Bỏ qua UPDATE/DELETE trên Old liệu
Một số tóm tắt có thể giả định rằng các bản ghi cũ sẽ không bao giờ được cập nhật hoặc xóa, nhưng chỉ có kỷ lục mới sẽ được chèn vào. Quá trình tóm tắt có thể tiết kiệm rất nhiều công sức bằng cách giả định rằng nó không cần phải kiểm tra các bản cập nhật trên dữ liệu cũ hơn.
Nhưng tất nhiên điều này sẽ không áp dụng cho tất cả các bảng.
Giữ một Log
Giả sử rằng tôi sẽ không có quyền truy cập vào, hoặc không muốn sử dụng các bản ghi MySQL nhị phân.
Để tóm tắt dữ liệu mới, quá trình tóm tắt chỉ cần nhớ id khóa chính cuối cùng cho các bản ghi cuối cùng được tóm tắt. Lần sau nó chạy, nó có thể tóm tắt mọi thứ sau id đó. Tuy nhiên, để theo dõi các bản ghi cũ đã được cập nhật/xóa, nó cần một bản ghi khác để nó có thể quay trở lại và tóm tắt lại dữ liệu đó.
tôi sẽ đánh giá cao bất kỳ loại chiến lược, góp ý hay liên kết có thể giúp đỡ. Cảm ơn bạn!
Chế độ xem vật chất là các chế độ xem có thể được lập chỉ mục (được gọi là "các chế độ xem được lập chỉ mục" trong thuật ngữ TSQL/SQL Server). Chúng bị hạn chế trong chức năng, và MySQL không hỗ trợ chúng. MySQL hầu như không hỗ trợ quan điểm phi vật chất, so sánh chức năng với các nhà cung cấp khác. Oracle là chỉ DB khác tôi biết rằng hỗ trợ quan điểm vật hoá, bên cạnh SQL Server. Tôi mong đợi DB2 sẽ làm, nhưng PostgreSQL thì không. –