2012-07-23 41 views
5

tôi đang tìm cách tăng tốc một số truy vấn bằng cách sử dụng các câu lệnh đã được chuẩn bị trên trang web có lưu lượng truy cập cao. những gì tôi không nghĩ rằng tôi hiểu đúng là lợi ích từ việc sử dụng báo cáo chuẩn bị, trừ khi họ có thể ở lại chuẩn bị qua nhiều kết nối. có vẻ như điều này là không thể với PDO mà cũng không cho phép kết nối liên tục. nhưng các chức năng kết nối liên tục không cho phép PDO.mysql báo cáo chuẩn bị vĩnh viễn

cho phép nói cho lập luận vì tôi đang chạy một truy vấn 5.000 lần mỗi giây: SELECT * FROM some_table ĐÂU some_column LIKE 'some_value'

từ những gì tôi hiểu, PDO sẽ ngăn chặn mysql từ tái biên dịch và đánh giá truy vấn nếu tôi đã thay đổi "some_value" mỗi khi tôi cần truy vấn. tôi cũng hiểu rằng "some_value" có thể được truyền theo nhị phân thay vì ASCII để tiết kiệm băng thông, nhưng nó sẽ không tiết kiệm được nhiều nếu tôi phải gửi toàn bộ truy vấn mỗi khi tôi mở kết nối.

cũng từ những gì tôi đã đọc, các thủ tục được lưu trữ không phải là giải pháp, bởi vì các quy trình này không được biên dịch thông qua nhiều kết nối.

có giải pháp nào cho vấn đề này không? lưu trữ một tuyên bố chuẩn bị trên máy chủ một nơi nào đó và có nó ở lại biên dịch trong bộ nhớ và sẵn sàng để bắn ngay sau khi nó nhận được các biến?

có cách nào để thực hiện điều này bằng cách kết hợp kết nối tổng hợp với PDO không? (mặc dù tôi cũng đã nghe kết nối tổng hợp không lý tưởng vì nó có thể gây tắc nghẽn trong các điều kiện nhất định)

+0

Nếu bạn muốn sử dụng kết nối liên tục, bạn phải thiết lập PDO :: ATTR_PERSISTENT trong mảng các tùy chọn điều khiển truyền cho constructor PDO . Nếu thiết lập thuộc tính này với PDO :: setAttribute() sau khi instantiation của đối tượng, trình điều khiển sẽ không sử dụng các kết nối liên tục. –

+1

Tại sao không sử dụng Memcached? –

Trả lời

0

Sử dụng câu lệnh đã chuẩn bị với MySQL không có khả năng làm cho truy vấn của bạn nhanh hơn nhiều và ngăn bộ đệm truy vấn hoạt động. Bạn cần một số bộ nhớ đệm ở phía trước của cơ sở dữ liệu của bạn nếu bạn thực sự cần phải chạy cùng một truy vấn 5k/s. Memcached là phổ biến, như là Redis. Tùy thuộc vào những gì bạn đang làm, các yếu tố bộ nhớ đệm hoặc toàn bộ trang cũng có thể là một tùy chọn.

+2

Điều này không đúng, các câu lệnh được chuẩn bị nhất ** được ** lưu vào bộ nhớ cache! Xem http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html –

+0

Ah, đây là hành vi mới trong 5.1.17, cảm ơn bạn. –

5

Sau khi chạy nhiều điểm chuẩn, chúng tôi thấy rằng các báo cáo chuẩn bị đã chuẩn bị trên máy chủ cung cấp cho chúng tôi lợi ích tốc độ cao nhất. Dưới đây là ví dụ:

DROP PROCEDURE IF EXISTS get_user; 

DELIMITER // 

CREATE PROCEDURE get_user(IN v_user VARCHAR(255)) 
DETERMINISTIC 
READS SQL DATA 
SQL SECURITY INVOKER 
COMMENT '' 
proc: BEGIN 
    SET @user = v_user; 

    IF ISNULL(@get_user_prepared) THEN 
     SET @get_user_prepared = TRUE; 

     SET @sql = "SELECT * FROM mysql.user WHERE user = ?"; 

     PREPARE get_user_stmt FROM @sql; 
    END IF; 

    EXECUTE get_user_stmt USING @user; 
END; 
// 

DELIMITER ; 
+0

Mọi câu lệnh được chuẩn bị sẵn được chuẩn bị trên máy chủ. Nó không, tuy nhiên, làm cho chúng liên tục giữa các kết nối. –

0

Không, không có cách nào để sử dụng câu lệnh được chuẩn bị liên tục.

Tuy nhiên, có một giải pháp lý tưởng cho truy vấn chạy 5.000 lần mỗi giây - Handlersocket