2009-07-27 32 views
6

Tôi cần một cách đơn giản để kiểm tra các truy vấn SQL về tốc độ. Tôi không phải lo lắng về sự khác biệt về phần cứng, về cơ bản tôi cần một số tương đối.Làm thế nào để kiểm tra tốc độ truy vấn MySQL, với ít mâu thuẫn?

Đây là những gì tôi đã làm với PHP (mờ của nó, nhưng hoạt động):

// CONNECT TO DB HERE 

$sub = new YomoSubscription(95,783); 

$t = microtime(TRUE); 

// contains the SQL db call i'm testing 
$fp = $sub->generateFingerprint(); 

echo microtime(TRUE)-$t; 

Các VẤN ĐỀ Tôi gặp là, đôi khi trên kết nối ban đầu/chạy thử nghiệm của tôi mất 1,25 giây ví dụ. Tuy nhiên, khi kết nối tiếp theo, phải mất 0,00 giây ... Tại sao lại là?

Tôi khá chắc chắn rằng bộ nhớ cache truy vấn MySQL tắt trong my.ini:

query_cache_size=0 

Trả lời

4

Truy vấn đầu tiên của bạn có thể chậm hơn vì MySQL thực sự đang truy cập đĩa trên truy vấn đầu tiên chứ không phải trên truy vấn thứ hai.

Hệ điều hành của bạn có thể lưu các tệp trong bộ nhớ khi chúng được đọc; kết quả là, lần đọc tiếp theo có thể không cần phải thực sự nhấn đĩa, và sẽ trở lại nhanh hơn nhiều.

Theo quy tắc chung, tôi thường chạy truy vấn một vài lần và tìm sự nhất quán. Thường xuyên hơn không, lần chạy đầu tiên sẽ mất nhiều lần lâu hơn, trong khi lần thứ 3 và thứ 4 mất khoảng thời gian tương tự. Những lần chạy tiếp theo đó có thể đại diện cho loại hiệu năng bạn sẽ thấy trên hệ thống sản xuất thực tế - vì cơ sở dữ liệu sản xuất của bạn nên giữ dữ liệu đó trong bộ nhớ cache của hệ điều hành, trong khi hệ thống dev của bạn hiếm khi được truy cập.

Cuối cùng, khi nói đến hiệu suất truy vấn, bạn chỉ cần cung cấp cho nó sự phát triển nhanh và theo dõi truy vấn đăng nhập chậm trong sản xuất để xem truy vấn nào thực sự cần.

Theo như các truy vấn chạy chương trình cho dữ liệu hiệu suất, hãy lấy một vài mẫu và sử dụng giá trị trung bình. Nhưng trong thực tế, điều này sẽ không đại diện cho các vấn đề hiệu suất thực tế mà bạn sẽ gặp phải trong quá trình sản xuất.

0

Bạn có thể sử dụng các kết nối liên tục trong lớp học của bạn. Một kết nối sẽ tái sử dụng kết nối và sẽ giải thích cho loại trễ này.

2

Giả sử rằng:

  1. bạn không sử dụng kết nối persistant
  2. cơ sở dữ liệu được cài đặt trên máy chủ nơi các số liệu thống kê được thực hiện (không có kết nối mạng)
  3. không ai khác đang sử dụng cơ sở dữ liệu (hàng/bảng khóa)
  4. không có quy trình nặng nào khác đang chạy
  5. vv ....

Nếu bạn thực sự muốn chuẩn truy vấn của bạn, bạn phải làm như sau:

$database->query('SET SESSION query_cache_type = OFF'); 

Sau đó, bạn chạy truy vấn 2-3 lần trong một vòng lặp (để "hâm nóng" các máy chủ) .

Và chỉ sau đó:

$database->query('FLUSH STATUS'); #If you use the stats to profile your query 

$t = microtime(TRUE); 
$fp = $sub->generateFingerprint(); 
echo microtime(TRUE)-$t; 

$database->query('SHOW STATUS'); 

Et thì đấy !! :)))

BTW, tốc độ truy vấn là một trong những thông số cần đọc. Tìm hiểu cách đọc thông tin quý giá được trả về bởi SHOW STATUSEXPLAIN .... Điều này sẽ tốt hơn rất nhiều.

Đây là một liên kết mà bạn sẽ yêu: http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/

Thưởng thức. :)

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