2010-11-15 23 views
7

Tôi cần tìm một số biện pháp về thời gian truy vấn của tôi đang thực hiện và tải trên máy chủ nếu có thể.Làm thế nào tôi có thể đo thời gian mysql, thời gian và/hoặc tải của một truy vấn sql trong php?

Tôi nghi ngờ có thể, nhưng tôi cũng muốn sử dụng CPU.

Bất kỳ ý tưởng nào?

+0

câu hỏi, cơ sở dữ liệu và máy chủ web giống nhau? – ajreal

+0

Không vì thời gian thực hiện để xử lý truy vấn không hiển thị mức sử dụng CPU trên máy chủ. Nó có thể là một truy vấn nhanh/lớn hoặc truy vấn chậm. – Jules

+0

Mysql 5.6 có mô-đun hiệu suất. điều này có thể hữu ích. – Merlin

Trả lời

20

PHP Cú pháp

$starttime = microtime(); 
$query = mysql_query("select * from table"); 
$endtime = microtime(); 

Sau đó tính toán sự khác biệt giữa $ StartTime và $ EndTime.

+0

Tôi muốn bỏ phiếu cho bạn, nhưng bạn chỉ nên sử dụng đánh dấu cú pháp cho mã. – fncomp

+0

Khi cơ sở dữ liệu và máy chủ web nằm trên các máy chủ khác nhau, điều này sẽ không thể phân biệt được nếu cơ sở dữ liệu bị chậm hoặc máy chủ web. – Jules

+0

Xem xét trang PHP chỉ đang đợi truy vấn MySQL kết thúc, điều này có thể đủ tốt để xác định thời gian thực hiện truy vấn. Nó không chắc rằng ngay cả một máy chủ web chậm sẽ ảnh hưởng đến tốc độ báo cáo; nếu nó chậm, thì bạn sẽ có những vấn đề rõ ràng hơn. Nhưng vì lý do bạn đã đề cập, điều này sẽ không giúp tìm cách sử dụng CPU. – Matthew

2

là hầu như không thể đưa ra cơ sở dữ liệu của bạn và máy chủ web đều nằm cách khác nhau
cộng bạn cố gắng để đạt được nó sử dụng PHP

giới hạn

  • bạn cần phải có quyền truy cập vào cả hai máy chủ (ví dụ như ssh)
  • nếu bạn nhúng kiểm tra tải CPU chẳng hạn như s_ exec_shell vào cơ sở dữ liệu và trả về uptime sau mỗi lần thực hiện truy vấn, là quá mức cần thiết

workaround

nhúng một cronjob trong máy chủ cơ sở dữ liệu của bạn,
định kỳ gửi email nếu tải máy chủ đó lại không trúng

Hoặc

tại cơ sở dữ liệu,
định kỳ gửi email trên truy vấn đang chạy hiện tại sử dụng
show full processlist

Ví dụ để lưu trữ HIỂN THỊ ĐẦY ĐỦ processlist

$con = mysqli_connect(...) or die('unable to connect'); 
$sql = "show full processlist"; 
$res = mysqli_query($con, $sql) or die($sql); 

/* optional path is /tmp */ 
$fp = fopen('/tmp/'.date('YmdHis'), 'w+'); 
while ($row = $res->fetch_row()) 
{ 
    fputcsv($fp, $row); 
} 
$res->free_result(); 

Trên đây nên là đủ để đổ hiện mysql quá trình-list vào một tập tin.
Trong hộp linux, có rất nhiều lệnh cho phép người dùng hiển thị tải CPU.
Nhưng là cửa sổ, tôi đoán bạn có thể hình dung ra với một số tìm kiếm trên google của SO

+0

Tôi đang sử dụng máy chủ được chia sẻ với gói lưu trữ ISP của mình, vì vậy tôi có thể phân biệt truy vấn nào về thời gian/tải là lỗi của tôi không? – Jules

+0

@Jules - Khá chắc chắn cơ sở dữ liệu của bạn được phân lập với nhau. Yêu cầu ISP của bạn bắt đầu lược tả 'hiển thị toàn bộ danh sách xử lý' và gửi email cho bạn dưới dạng bản ghi hoặc được lưu trữ trong máy chủ để bạn truy cập sau này. – ajreal

+0

Bạn sử dụng danh sách quy trình đầy đủ ở đâu? – Jules

0

Có khá nhiều thông tin bạn có thể nhận được khoảng cơ sở dữ liệu sử dụng

SHOW STATUS; 

truy vấn.

Tôi cho rằng biến Last_query_cost có thể khá hữu ích cho mục đích đo lường của bạn. Cũng như Slow_queries sẽ hiển thị số lượng quires đang chạy lâu hơn một khoảng thời gian nhất định. Danh sách đầy đủ của các biến này là ở đây http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.html Ngoài ra còn có chức năng php mysql_stat() chức năng php trả về một số dữ liệu sử dụng cơ sở dữ liệu. Ví dụ Truy vấn mỗi giây có thể hơi hữu ích. Nhưng để giữ một dữ liệu nhất định hơn sẽ yêu cầu quyền truy cập ssh vào cơ sở dữ liệu.

+0

Last_query_cost luôn luôn có vẻ trở về số không. Tôi không có quyền truy cập vào các truy vấn chậm vì nó chứa các truy vấn từ các máy khách lưu trữ khác. Các truy vấn chậm cũng không. – Jules

0

PHP có thể thực sự chỉ có thời gian thời gian mysql_query() thực hiện, trong đó bao gồm cả chuyến đi vòng, thời gian trễ và thời gian chuyển. Để có một sự phá vỡ, bạn sẽ cần phải sử dụng trình lược tả MySQL như đã đề cập. Đoạn mã sau sẽ xuất ra thông tin bạn cần biết. Nếu bạn muốn kết hợp lược tả vào quá trình PHP của mình, bạn sẽ phải sử dụng profiler và chọn các trường có liên quan từ bảng information_schema.profiling, nhưng nếu nó chỉ là để kiểm tra hiệu suất dưới đây là đủ.

<?php 

$con = mysql_connect("localhost","root","my-password"); 
if (!$con) 
{ 
die('Could not connect: ' . mysql_error()); 
} 

mysql_select_db("my-database", $con); 

function microtime_float() 
{ 
list($usec, $sec) = explode(" ", microtime()); 
return ((float)$usec + (float)$sec); 
} 

mysql_query("set profiling=1;"); 

$starttime = microtime_float(); 
$query = mysql_query("SELECT * FROM my-table"); 
$endtime = microtime_float(); 
$trans_result = mysql_query("select sum(duration) as transtime from information_schema.profiling where query_id=1"); 
$transtime = mysql_result($trans_result, 0, 'transtime'); 
$total_time = ($endtime - $starttime); 
$transtime = ($total_time - $transtime); 

echo 'Total time: '.$total_time.' secs<br />'; 
echo 'Transfer time: '.$transtime.' secs<br />'; 
echo 'Query time break-down;<br />'; 

$debug_result = mysql_query("show profile cpu for query 1;"); 
while ($row = mysql_fetch_assoc($debug_result)) { 
    echo $row['Status'].' (Time: '.$row['Duration'].', CPU_User: '.$row['CPU_user'].', CPY_sys: '.$row['CPU_system'].')<br />';  
} 
?> 

Khi bạn hài lòng với hiệu suất, hãy xóa tất cả trừ truy vấn MySQL bạn muốn.

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