I execute MySQL queries from PHP and would like to know how time consuming they are. Is there any way to get the execution time of a MySQL query from PHP?
我从PHP执行MySQL查询,希望知道它们的使用时间。有没有办法从PHP中获取MySQL查询的执行时间?
I also wonder if the execution time depends on how loaded is the web server. I can imagine that a query will take more time to execute if the server is busy with other queries. On the other hand, I can imagine that, if the server is busy, the query will just wait for its turn and then it will be executed (without any queries executed in parallel) and than the waiting time is not included into the execution time. So, what scenarios (out of two) is correct?
我还想知道,执行时间是否取决于web服务器的加载方式。我可以想象,如果服务器忙于处理其他查询,那么执行查询将花费更多的时间。另一方面,我可以想象,如果服务器繁忙,查询只会等待轮到它,然后执行它(没有并行执行任何查询),而等待时间不包含在执行时间中。那么,两种情况中哪种情况是正确的呢?
3 个解决方案
#1
52
There is probably some way to do this via MySQL, however, the easy (and reliable) way is using PHP's microtime
function, which returns the current time as milliseconds.
可能有一些方法可以通过MySQL实现,但是,简单(和可靠)的方法是使用PHP的微时间函数,它将当前时间返回为毫秒。
microtime() returns the current Unix timestamp with microseconds. This function is only > available on operating systems that support the gettimeofday() system call.
microtime()用微秒返回当前Unix时间戳。该函数仅在支持gettimeofday()系统调用的操作系统上可用。
getasfloat - When called without the optional argument, this function returns the string "msec sec" where sec is the current time measured in the number of seconds since the Unix Epoch (0:00:00 January 1, 1970 GMT), and msec is the microseconds part. Both portions of the string are returned in units of seconds.
getasfloat——当在没有可选参数的情况下调用时,该函数返回字符串“msec sec sec”,其中sec是当前时间,以Unix纪元后的秒数(格林尼治标准时间1月1日0:00)衡量,msec是微秒部分。字符串的两个部分都以秒为单位返回。
If the optional get_as_float is set to TRUE then a float (in seconds) is returned.
如果可选的get_as_float被设置为TRUE,则返回一个浮点数(以秒为单位)。
Some example code:
一些示例代码:
$sql = '...';
$msc = microtime(true);
mysql_query($sql);
$msc = microtime(true)-$msc;
echo $msc . ' s'; // in seconds
echo ($msc * 1000) . ' ms'; // in millseconds
#2
7
microtime()
takes time to execute itself. If you want to get the data straight from mysql, do this...
微时间()需要时间来执行它自己。如果你想直接从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';
#3
-3
To get it right out of MySQL you can use the general log.
要从MySQL中得到它,可以使用常规日志。
If its not already on, turn it on:
如果还没打开,打开:
SET GLOBAL general_log = 'ON';
To see the data after you've run your query:
在运行查询后查看数据:
SELECT * FROM mysql.general_log;
Among other things, you will get the query execution time, just like you've probably seen in phpmyadmin.
此外,您将获得查询执行时间,就像您在phpmyadmin中看到的那样。
#1
52
There is probably some way to do this via MySQL, however, the easy (and reliable) way is using PHP's microtime
function, which returns the current time as milliseconds.
可能有一些方法可以通过MySQL实现,但是,简单(和可靠)的方法是使用PHP的微时间函数,它将当前时间返回为毫秒。
microtime() returns the current Unix timestamp with microseconds. This function is only > available on operating systems that support the gettimeofday() system call.
microtime()用微秒返回当前Unix时间戳。该函数仅在支持gettimeofday()系统调用的操作系统上可用。
getasfloat - When called without the optional argument, this function returns the string "msec sec" where sec is the current time measured in the number of seconds since the Unix Epoch (0:00:00 January 1, 1970 GMT), and msec is the microseconds part. Both portions of the string are returned in units of seconds.
getasfloat——当在没有可选参数的情况下调用时,该函数返回字符串“msec sec sec”,其中sec是当前时间,以Unix纪元后的秒数(格林尼治标准时间1月1日0:00)衡量,msec是微秒部分。字符串的两个部分都以秒为单位返回。
If the optional get_as_float is set to TRUE then a float (in seconds) is returned.
如果可选的get_as_float被设置为TRUE,则返回一个浮点数(以秒为单位)。
Some example code:
一些示例代码:
$sql = '...';
$msc = microtime(true);
mysql_query($sql);
$msc = microtime(true)-$msc;
echo $msc . ' s'; // in seconds
echo ($msc * 1000) . ' ms'; // in millseconds
#2
7
microtime()
takes time to execute itself. If you want to get the data straight from mysql, do this...
微时间()需要时间来执行它自己。如果你想直接从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';
#3
-3
To get it right out of MySQL you can use the general log.
要从MySQL中得到它,可以使用常规日志。
If its not already on, turn it on:
如果还没打开,打开:
SET GLOBAL general_log = 'ON';
To see the data after you've run your query:
在运行查询后查看数据:
SELECT * FROM mysql.general_log;
Among other things, you will get the query execution time, just like you've probably seen in phpmyadmin.
此外,您将获得查询执行时间,就像您在phpmyadmin中看到的那样。