我从PHP执行MySQL查询,并想知道它们是多么耗时。有没有办法从PHP获取MySQL查询的执行时间?如何从PHP获取MySQL查询的执行时间?
我也想知道执行时间取决于Web服务器的加载情况。我可以想象,如果服务器忙于其他查询,查询将需要更多时间来执行。另一方面,我可以想象,如果服务器繁忙,查询将等待轮到它,然后它将被执行(没有任何并行执行的查询),并且等待时间不包括在执行时间内。那么,什么情况(两个)是正确的?
我从PHP执行MySQL查询,并想知道它们是多么耗时。有没有办法从PHP获取MySQL查询的执行时间?如何从PHP获取MySQL查询的执行时间?
我也想知道执行时间取决于Web服务器的加载情况。我可以想象,如果服务器忙于其他查询,查询将需要更多时间来执行。另一方面,我可以想象,如果服务器繁忙,查询将等待轮到它,然后它将被执行(没有任何并行执行的查询),并且等待时间不包括在执行时间内。那么,什么情况(两个)是正确的?
可能有一些方法可以通过MySQL来实现,但是,简单(可靠)的方法是使用PHP的microtime
函数,该函数返回当前时间为毫秒。
microtime()以微秒为单位返回当前的Unix时间戳。此功能仅在支持gettimeofday()系统调用的操作系统上可用。
getasfloat - 当没有可选参数调用,该函数返回字符串“毫秒秒”,其中sec是自Unix纪元中的秒数测量的当前时间(0点零零分00秒1970年1月1日GMT),msec是微秒部分。字符串的两部分都以秒为单位返回。
如果可选get_as_float设置为TRUE,则返回浮点数(以秒为单位)。
一些示例代码:
$sql = '...';
$msc = microtime(true);
mysql_query($sql);
$msc = microtime(true)-$msc;
echo $msc . ' s'; // in seconds
echo ($msc * 1000) . ' ms'; // in millseconds
为了得到它右出的MySQL,你可以使用一般的日志。
如果它不是已经打开,打开它:
SET GLOBAL general_log = 'ON';
要查看这些数据,您已经运行查询后:
SELECT * FROM mysql.general_log;
除此之外,您将获得查询执行时间,就像你可能在phpmyadmin中见过的一样。
microtime()
需要时间来执行它自己。如果你想直接从MySQL获取数据,请执行此操作...
mysql_query("SET profiling = 1;");
if (mysql_errno()) { die("ERROR ".mysql_errno($link) . ": " . mysql_error($link)); }
$query="SELECT some_field_name FROM some_table_name";
$result = mysql_query($query);
if (mysql_errno()) { die("ERROR ".mysql_errno($link) . ": " . mysql_error($link)); }
$exec_time_result=mysql_query("SELECT query_id, SUM(duration) FROM information_schema.profiling GROUP BY query_id ORDER BY query_id DESC LIMIT 1;");
if (mysql_errno()) { die("ERROR ".mysql_errno($link) . ": " . mysql_error($link)); }
$exec_time_row = mysql_fetch_array($exec_time_result);
echo "<p>Query executed in ".$exec_time_row[1].' seconds';
谢谢你的答案。顺便问一下,可能你也知道问题的第二部分?这个时间应该取决于服务器加载的强度? – Roman 2010-12-21 17:38:04
Roman - 是的,当然。它在TIME之外工作,而不是CPU STEPS,因为这样一切都可能影响它,甚至是一个新的连接(作为例子)。 – Christian 2010-12-21 18:15:24