2011-06-22 40 views
5

Tôi đang xây dựng một cửa hàng trực tuyến & cố gắng cải thiện hiệu suất bằng cách giảm thiểu các truy vấn MYSQL.PHP - Có thực hành tốt để lưu các truy vấn MYSQL trong một tệp txt không?

Thực tiễn tốt là lưu vào bộ nhớ cache truy vấn mysql qua tệp txt và sau đó tìm nạp thay vì truy vấn? Đây là những gì tôi đang làm"

  1. Một lớp học php mất truy vấn sql như là một chuỗi
  2. làm một md5 của nó
  3. nếu đây là lần đầu tiên nó chạy
  4. sau đó thực hiện truy vấn trên cơ sở dữ liệu
  5. có được kết quả trong một mảng
  6. serialize mảng và lưu nó như md5_Of_Query.txt
  7. trở lại hoặc unserialize (file_get_contents (md5_of_Query.txt)) hoặc res $ các truy vấn thực tế, tùy thuộc vào bộ nhớ cache tồn tại hay không và hợp lệ.
  8. Lớp này cũng kiểm tra filemtime() của tệp txt và nếu nó lớn hơn một giờ, sau đó thực hiện lại truy vấn và làm mới bộ nhớ cache.

Điều này có hiệu quả hơn làm truy vấn sql mỗi lần không? Bất kỳ vấn đề bảo mật nào tôi bị thiếu?

Trả lời

5

Nếu bạn chỉ cần khởi động ứng dụng, memcache là một cách nhanh hơn nhiều để đi vì sử dụng tập tin văn bản.

http://memcached.org/

chữ file này sẽ thực hiện công việc, và các bước mà bạn đã vạch ra có ý nghĩa, nhưng memcache sẽ nhanh hơn và xử lý rất nhiều các nâng nặng cho bạn.

+0

Cảm ơn rất nhiều, Got memcache đã được cài đặt trên máy chủ WAMP của tôi, sẽ xây dựng bằng bộ nhớ cache này ngay bây giờ. – Emmanuel

+0

Trên một WAMP duy nhất nó không thể tạo sự khác biệt, truy cập tệp văn bản trên Windows là ** đã ** lưu trong bộ nhớ. Memcached bổ sung thêm chi phí và ** đánh cắp bộ nhớ ** máy chủ web và DB sẽ sử dụng nhiều hơn. Memcached có nghĩa là cho nhiều * ** * ** nhiều kịch bản lớn hơn. Với các trang trại * máy chủ * lớn và * nhóm * của máy chủ lưu trữ bộ nhớ đệm trả lời các truy vấn và truy vấn phụ. Trong kịch bản đó memcached (mà thẩm vấn máng bộ nhớ một ** rất văn bản giao thức ** trên một ** ổ cắm mạng **) có thể phun tốt nhất của hiệu suất ra khỏi sự phong phú của các nguồn tài nguyên phong phú. Các máy đơn lẻ có thể không nhận được lợi ích nào từ nó. – ZJR

+0

Điểm tuyệt vời, tuy nhiên, nên lập kế hoạch mở rộng ở đầu chu kỳ phát triển của một ứng dụng. Tôi không tin rằng ứng dụng sẽ được lưu trữ trên một máy chủ WAMP, tôi cho rằng đó chỉ là để phát triển và thử nghiệm. – serialworm

2

Phương pháp của bạn trông giống như chuyển sự cố từ góc này sang góc khác.

Giới thiệu bộ nhớ cache không cải thiện hiệu suất Mysql. Nhìn tốt hơn các truy vấn nào thực sự chậm và sau đó tối ưu hóa các truy vấn.

http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

8

Nếu bạn thực hiện một điểm chuẩn, chi phí của việc tạo một băm duy nhất và thực hiện IO vào đĩa sẽ lớn hơn chỉ đơn giản là lấy từ máy chủ MySQL.

IMHO, đừng bận tâm đến mức độ đó. Những suy nghĩ tốt, nhưng MySQL đã có bộ nhớ đệm nội bộ và tinh chỉnh hiệu suất.

Tập trung vào việc xây dựng ứng dụng của bạn, vì "tối ưu hóa sớm là gốc rễ của mọi điều ác".

+0

Cảm ơn. Bạn đã tiết kiệm cho tôi rất nhiều thử và sai với lời khuyên của bạn. – Emmanuel

2

Nếu bạn muốn đạt được bộ nhớ đệm với khả năng mở rộng trong tương lai, tôi khuyên bạn nên thiết lập các dịch vụ RESTful chạy truy vấn trên cơ sở dữ liệu, và sau đó sử dụng các tính năng bộ nhớ đệm HTTP của máy chủ web của bạn để lưu trữ kết quả.Các bước sẽ như thế nào:

  1. các trang gốc cần chạy một truy vấn
  2. Nó tạo ra một http request GET URL của dịch vụ thông qua các thông số như tham số truy vấn trong URL
  3. Một kịch bản php tọa lạc tại URL chấp nhận các tham số cho truy vấn, xác nhận họ, và thêm chúng vào một truy vấn MySql
  4. kịch bản chạy các truy vấn trên cơ sở dữ liệu
  5. kịch bản serializes kết quả và đặt nó như là đầu ra
  6. web s erver lưu trữ đáp ứng cho yêu cầu và trả nó cho các yêu cầu trong tương lai với cùng một URL
  7. Các trang gốc sử dụng các kết quả serialized từ dịch vụ để tạo ra HTML

Bạn có thể đọc thêm về bộ nhớ đệm PHP với Apache here . Những gì bạn đang làm bây giờ là gần với điều này, nhưng ứng dụng của bạn sẽ có thể mở rộng tốt hơn với cách tiếp cận dựa trên dịch vụ.

1

Chỉ muốn cân nhắc trong hai xu của tôi, những gì serialworm và thephpdeveloper cho biết chia sẻ thực tế là bộ nhớ/ram nhanh hơn nhiều so với bất kỳ hoạt động liên quan đến đĩa IO nào bạn đưa ra. Hãy ném càng nhiều RAM càng tốt vào mysql và bạn sẽ không cần phải xử lý bộ nhớ cache trừ khi bạn thực sự cần nâng cấp lên một cụm và cần cân nhắc khác. Memcache cung cấp cho bạn nhiều quyền kiểm soát hơn đối với việc quản lý bộ nhớ cache và do đó bạn cần phải thực hiện thêm mã hóa.

Tôi sẽ bắt đầu bằng cách tạo ứng dụng rồi thử nghiệm ứng dụng và tối ưu hóa truy vấn và/hoặc thêm quản lý bộ nhớ cache nếu cần.

0

Bạn đã định cấu hình query cache của MySQL chưa?

1

Hai điều 2 xem, benchmarkingprofiling. Về cách duy nhất bạn có thể so sánh một cách có ý nghĩa là sử dụng 2 chỉ số của các diciplines này, sử dụng cấu hình mysql hiện tại của bạn, php.ini, httpd.conf, .htaccess, công cụ viết lại mod và nhiều thứ khác sẽ là điểm chuẩn và lược tả các công nghệ diễn xuất thực hiện nhiệm vụ.

1

Thật vô nghĩa, bạn nên cache kết quả.

Thời gian lắp ráp truy vấn nên khá đáng kể. (Nếu không, bạn không sử dụng SQL vì nó là nghĩa vụ phải, tạo ra, thay vào đó, suối của ngu ngốc select là nơi một thông minh join sẽ giải quyết)

tải từ đĩa truy vấn rõ ràng là dễ bị chậm lại.
(Các hệ điều hành có thể được bộ nhớ đệm đĩa IO, tuy nhiên, và làm cho nó khó khăn để phát hiện)

Điều gì thực sự nên dành thời gian dù sao, được nhận kết quả ra khỏi DB và sau đó phong cách chúng trở lại vào một trang web máng một mẫu. Tại vị trí của bạn, tôi sẽ lưu vào bộ nhớ kết quả theo kiểu của truy vấn đã cho và khi được hỏi, nếu bộ nhớ cache không cũ, tôi sẽ trực tiếp readfile() chúng.

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