如何在php中测量mysql时间,sql查询的时间和/或负载?

时间:2010-11-15 09:10:10

标签: php mysql

我需要找一些衡量我的查询所用时间以及服务器负载的方法。

我怀疑它可能,但我也希望获得cpu使用。

有什么想法吗?

7 个答案:

答案 0 :(得分:21)

PHP语法

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

然后计算$ starttime和$ endtime之间的差异。

答案 1 :(得分:6)

查看查询分析器。这可能会查询您所需的查询时间位。

https://www.digitalocean.com/community/tutorials/how-to-use-mysql-query-profiling

https://dev.mysql.com/doc/refman/5.5/en/show-profile.html

有各种工具可以查看服务器上的负载

答案 2 :(得分:2)

鉴于您的数据库和Web服务器的位置不同,几乎是不可能的 再加上你试图用PHP实现它

限制

  • 您需要有权访问这两个服务器(例如ssh)
  • 如果您将CPU加载检查(例如exec_shell ssh)嵌入到数据库中并在每次执行查询时返回uptime,那么就是矫枉过正

的解决方法

在您的数据库服务器中嵌入一个cronjob,
如果服务器负载很高,则定期发送电子邮件

或者

在数据库中,
使用
定期发送有关当前运行查询的电子邮件 show full processlist

存储SHOW FULL 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();

以上内容应足以将当前的mysql进程列表转储到文件中 在linux框中,有许多命令允许用户显示CPU负载 但是窗口,我想你可以通过搜索谷歌的SO搜索

答案 3 :(得分:0)

使用

可以获得有关数据库的大量信息
SHOW STATUS;

查询。

我认为Last_query_cost变量对于测量目的非常有用。和Slow_queries一样,它会显示运行时间超过一定时间的quires数量。这些变量的完整列表在http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.html 还有一个php函数mysql_stat() php函数,它返回一些数据库使用数据。例如,每秒查询可能有点用处。 但是要掌握更确定的数据将需要ssh访问数据库。

答案 4 :(得分:0)

使用microtime来衡量查询所需的时间。

有关服务器负载,请参阅http://www.php.net/manual/en/function.sys-getloadavg.php。 CPU使用率大多不相关,因为mysql在大多数情况下都会被磁盘限制。

答案 5 :(得分:0)

有关更详细的统计信息,您应该使用mysqli :: get_connection_stats(如果您使用的是php 5.3 +)

http://www.php.net/manual/en/mysqli.get-connection-stats.php

答案 6 :(得分:0)

PHP实际上只能计算mysql_query()执行时间,包括整个往返,延迟和传输时间。要进行分解,您需要使用已经提到的MySQL分析器。以下代码应输出您需要知道的信息。如果要将分析合并到PHP过程中,则必须使用分析器并从information_schema.profiling表中选择相关字段,但如果只是为了检查性能,则下面的内容就足够了。

<?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 />';    
}
?>

一旦您对性能感到满意,请删除除所需的MySQL查询以外的所有内容。