Php 计算查询时间&;Mysql

Php 计算查询时间&;Mysql,php,mysql,execution-time,Php,Mysql,Execution Time,我试图使用php脚本计算查询运行所需的时间: 例如: $sql = "SELECT COUNT(*) FROM `order_items` LEFT JOIN `orders` ON `oi_o_id` = `o_id` WHERE `o_status` = 'completed' AND `oi_p_id` = '10' LIMIT 1"; $sqlStart = getMicroTime(); $result = mysql_query($sql); $sqlEnd = getMicroTi

我试图使用php脚本计算查询运行所需的时间:

例如:

$sql = "SELECT COUNT(*) FROM `order_items` LEFT JOIN `orders` ON `oi_o_id` = `o_id` WHERE `o_status` = 'completed' AND `oi_p_id` = '10' LIMIT 1";
$sqlStart = getMicroTime();
$result = mysql_query($sql);
$sqlEnd = getMicroTime();
$sqlTime = $sqlEnd - $sqlStart;

echo $sqlTime;

function getMicroTime() {
    list($msec, $sec) = explode(' ', microtime());
    return floor($sec / 1000) + $msec;
}
这似乎在大多数情况下都有效,但偶尔会出现负值,例如
-0.98840499995276
这怎么可能?还有没有更好的方法来获取查询执行时间?


谢谢

您的微时间功能不是必需的,只需执行即可

$start = microtime(TRUE);
... do query
$end = microtime(TRUE);

传递真值时,microtime()会以实际浮点形式返回时间戳,而不是一些[真正令人讨厌但准确描述此人智力]认为是返回数据的有用方式的愚蠢字符串格式。

Hmm对我有用-PHP手册确实这么说。您是否检查过子空间时间异常:-)

还尝试了PHP手册中的替代方法

$time_start = microtime(true);

// Sleep for a while
usleep(100);

$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Did nothing in $time seconds\n";

有时PHP使用“E表示法”来表示浮点数:如果希望避免这种情况,可以通过以下方式使用round函数:

$start_time = (float) round(microtime(true) * 10000,0);
{your code here}
$finish_time = (float) round(microtime(true) * 10000,0);
$time = ($finish_time - $start_time) / 10000;

似乎从来没有得到过一个负数:不幸的是,我得到了,谢谢马克B的回答question@Neal实际上,它确实失败了——我刚刚增加到1000次迭代,但在986年左右失败了。这似乎是某种定时故障。对@Lizard版本进行一些小修改,没有负面时间:使用microtime()false this-$time=$time\u end-$time\u start;echo“在$time\u end-$time\u start=$time-seconds中未执行任何操作”
;产生这个输出——但不知何故PHP得到了正确的数学结果——知道它在这里实际在做什么吗?在0.55040500 1321470419-0.55024300 1321470419=0.000162秒中未执行任何操作。如果为false,则返回字符串。减去两个字符串基本上是没有意义的。我同意——但当我尝试时——它似乎起作用了。这很奇怪,因为PHP将使用它找到的第一个看起来像数字的位,它恰好是msec值。如果开始是'987 456',结束是'123 457'(实际差异:0.136秒),您将完成123-987=-864。我理解OP的问题-我想知道它为什么在PHP5.3.6中工作。尝试此$time\u start=microtime(false);usleep(100)$时间=微时间(假)$时间=$time\u end-$time\u start;echo“在$time\u end-$time\u start=$time-seconds中未执行任何操作”
;它正在以某种方式产生正确的结果
$start_time = (float) round(microtime(true) * 10000,0);
{your code here}
$finish_time = (float) round(microtime(true) * 10000,0);
$time = ($finish_time - $start_time) / 10000;