2009-03-23 22 views
6

Tôi có một ứng dụng web php nơi dữ liệu nhất định thay đổi hàng tuần nhưng được đọc thường xuyên.Kỹ thuật tốt nhất cho kết quả bộ nhớ đệm từ các truy vấn thay đổi không thường xuyên

Truy vấn SQL truy xuất dữ liệu và mã php cho đầu ra html khá phức tạp. Có nhiều kết nối bảng và nhiều phép tính - nhưng chúng dẫn đến một bảng html khá cơ bản. Người dùng được nhóm và bảng giống nhau cho mỗi nhóm mỗi tuần, nhưng khác nhau cho các nhóm khác nhau. Tôi có khả năng có thể có hàng trăm bảng cho hàng ngàn người dùng.

Vì lý do hiệu suất, tôi muốn lưu vào bộ nhớ cache dữ liệu này. Thay vì chạy các truy vấn và tính toán này mỗi khi có ai đó truy cập trang, tôi muốn chạy một quy trình hàng tuần để tạo bảng cho mỗi nhóm cho tôi đọc đơn giản khi được yêu cầu.

Tôi muốn biết kỹ thuật nào bạn đã sử dụng thành công hoặc không thành công để đạt được điều gì đó như thế này?

Tùy chọn tôi có thể nhìn thấy bao gồm:

  • Lưu trữ các kết quả html của các tính toán trong một bảng MySQL, xác định bởi nhóm người dùng
  • Lưu trữ dữ liệu kết quả trong một bảng MySQL, xác định bởi nhóm người dùng (khó khăn như không có số cố định của các mục dữ liệu)
  • Caching sản lượng trang trong các tập tin tĩnh

Bất kỳ lời đề nghị khác sẽ được hoan nghênh!

Trả lời

4

Có thực sự là một vài lựa chọn:

  • PreRender các trang trên một cơ sở hàng tuần và sau đó phục vụ họ "tĩnh".
  • Sử dụng bộ nhớ cache (ví dụ: Squid) để lưu trữ các câu trả lời như vậy trên cơ sở đầu tiên trong một tuần. Ví dụ: bạn có thể định cấu hình chính sách lưu vào bộ nhớ cache để các yêu cầu chuyển đến một trang cụ thể (ví dụ: very_long.php? ...) được lưu trữ riêng biệt với phần còn lại của trang web.
  • Đảm bảo bạn bật bộ nhớ đệm DB. MySQL có bộ nhớ đệm của riêng nó và bạn có thể tinh chỉnh nó để các truy vấn dài lặp đi lặp lại không được tính toán lại.
+0

Một số đề xuất tuyệt vời, cảm ơn. – Damovisa

+0

Danh sách các đề xuất tốt ở đây. Lưu ý rằng bộ nhớ đệm truy vấn MySQL không phải là bản sửa lỗi hoàn chỉnh - nó có các lợi ích và hạn chế (nó có thể làm mọi thứ tồi tệ hơn trên các dữ liệu được cập nhật thường xuyên). Như được đề xuất bởi Assaf, nó chỉ là một trong nhiều tùy chọn. – thomasrutter

2

trước hết, tiểu sử. xác minh rằng các truy vấn đó thực sự tiêu tốn một lượng thời gian đáng kể. có thể MySQL cache kết quả truy vấn đã thực hiện công việc cho bạn.

nếu chúng thực sự tiêu thụ tài nguyên, điều tôi sẽ làm là tạo bảng có kết quả tính toán và quy trình cần thực hiện khi cần thay đổi dữ liệu. những lần đọc thường xuyên này chỉ nên chuyển đến dữ liệu được tính trước, mà không cần phải kiểm tra xem liệu nó có còn hợp lệ hay không.

chỉ cần thêm một số móc vào các thủ tục sửa đổi dữ liệu cơ sở hoặc trình kích hoạt cơ sở dữ liệu nếu bạn có thể, những điều này sẽ được thực thi không thường xuyên (hàng tuần?) Và có thể mất nhiều thời gian để tạo ra bất kỳ kết quả nào.

+0

Tôi nghĩ đây là lần đầu tiên tôi nhìn thấy câu hỏi có bốn câu trả lời và tất cả đều là câu trả lời tốt (tất cả đều xứng đáng là một cuộc bỏ phiếu)! Đề xuất tốt ở đây. Sự cần thiết phải hồ sơ trước khi bạn tối ưu hóa là một điểm tốt. – thomasrutter

+0

True - Tôi đã rất ấn tượng! – Damovisa

6

Trong chức năng để tạo ra bàn, làm cho nó lưu trữ kết quả vào một tập tin trên đĩa:

/cache/groups/1.txt 
/cache/groups/2.txt 

Bạn không nhất thiết phải chạy một công việc hàng loạt hàng tuần cho nó, khi gọi chức năng lấy dữ liệu, kiểm tra xem bộ nhớ cache đã lỗi thời hay không tồn tại.Nếu vậy, tạo và lưu trữ kết quả sau đó. Nếu không, chỉ cần trả lại tệp đã lưu trong bộ nhớ cache.

function getGroupTable($groupId) { 
    if (cacheIsStale($groupId)) { 
     generateCache($groupId); 
    } 
    return file_get_contents($cacheFile); 
} 

Chức năng cacheIsStale() chỉ có thể nhìn vào file's timestamps để kiểm tra độ tươi.

+0

Đây là cách tôi xử lý một vấn đề như vậy từ lâu. –

+0

Đó là một giải pháp tốt và có lẽ tôi sẽ sử dụng. Tôi chỉ quan tâm đến tiềm năng (tương lai) cần phải sử dụng dữ liệu được tạo ra chứ không chỉ là html. – Damovisa

+0

trong trường hợp đó, bạn có thể lưu trữ các kết quả từ MySQL theo một định dạng khác, dễ tiếp cận hơn. CSV sẽ hoạt động dễ dàng (chức năng fgetcsv giúp ở đây), hoặc thậm chí bạn có thể đặt kết quả vào một mảng và sau đó tuần tự hóa nó. Tất nhiên, bạn có thể làm hai tệp bộ nhớ cache: HTML cũng như dữ liệu thô. – nickf

2

Có vẻ như bạn đã có hầu hết mọi thứ trong số đó.

Một tùy chọn khác, giả sử dữ liệu bảng không lớn, là sử dụng memcache để lưu trữ kết quả - điều này có thể là giải pháp nhanh hơn, mặc dù bạn cần kiểm tra yêu cầu bộ nhớ để xem đó có phải là tùy chọn khả thi hay không.

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