如何从 PHP 获取 MySQL 查询的执行时间?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4501876/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get the execution time of a MySQL query from PHP?
提问by Roman
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 服务器的加载方式。我可以想象如果服务器忙于其他查询,查询将花费更多时间来执行。另一方面,我可以想象,如果服务器很忙,查询将等待轮到它然后执行(没有任何并行执行的查询)并且等待时间不包括在执行时间中. 那么,哪些场景(两种)是正确的?
回答by Christian
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
函数,它以毫秒为单位返回当前时间。
microtime()returns the current Unix timestamp with microseconds. This function is only > available on operating systems that support the gettimeofday() system call.
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.
If the optional get_as_float is set to TRUE then a float (in seconds) is returned.
microtime()以微秒为单位返回当前的 Unix 时间戳。此函数仅在支持 gettimeofday() 系统调用的操作系统上可用。
getasfloat- 在不带可选参数的情况下调用时,此函数返回字符串“msec sec”,其中 sec 是自 Unix Epoch(格林威治标准时间 1970 年 1 月 1 日 0:00:00)以来以秒为单位测量的当前时间,而 msec 是微秒部分。字符串的两个部分都以秒为单位返回。
如果可选的 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
回答by G-J
microtime()
takes time to execute itself. If you want to get the data straight from mysql, do this...
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';
回答by profitphp
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 中看到的那样。