如何在PHP中显示MySQL查询的执行时间?

时间:2014-04-29 22:45:26

标签: php mysql pdo query-optimization

我正在开发一个PHP应用程序,它在文本框中进行查询并返回分页结果。作为应用程序的一部分,我想报告查询的运行时间。

这是我到目前为止所做的。

我开始时通过直接输入文本框并运行脚本来启用性能分析:

set global profiling = 1

使用提供的文本框,我输入以下查询:

select @@profiling

得到:

1

最后,我按如下方式运行查询:

select * from log

但是,当我运行命令以分析查询时:

show profiles

我没有收到任何结果,也没有在页面上显示任何内容。

由于我在命令“show profiles”后看到没有表格,这意味着没有足够的权限,或者我错过了另一个步骤?

我按照以下程序执行:

Measuring actual MySQL query time

请告知。

我的PHP代码如下:

<?php
    if($_POST)
    {
        $db = new PDO('mysql:host=localhost;dbname=<dbname>;charset=utf8', 'user', 'pass');
        $stmt = $db->prepare($_POST['query']);
        $stmt->execute();

        $records = $stmt->fetchAll(PDO::FETCH_ASSOC);

        $errmsg = $stmt->errorInfo()[2]; //Output the error message - Index 2 of the array

        echo $errmsg;
    }  
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Log</title>
</head>
<body>
    <form method="post" id="queryform">
        <div class="label">
            <span class="label">Enter SQL Query</span>
        </div>
        <div class="input">
            <input type="text" name="query" size="150" value="<?=$_POST['query']?>" />
        </div>
    </form>
    <? if (isset($records)): ?>
    <table border="1">
        <? foreach($records as $record): ?>
            <tr>
                <? foreach($record as $colname => $value): ?>
                    <td>
                       <?=$value;?>
                    </td>
                <? endforeach; ?>    
            </tr>
        <? endforeach; ?>
    </table>

    <? endif; ?>
</body>
</html>

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:6)

这就像一个魅力!

    $db->query('set profiling=1'); //optional if profiling is already enabled
    $db->query($_POST['query']);
    $stmt = $db->query('show profiles');
    $db->query('set profiling=0'); //optional as well

    $records = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $errmsg = $stmt->errorInfo()[2]; //Output the error message 

UPDATE(以下现在适用于我目前设置的innodb)

$db->query('set profiling=1'); //optional if profiling is already enabled
$db->query($_POST['query']);
$res = $db->query('show profiles');
$records = $res->fetchAll(PDO::FETCH_ASSOC);
$duration = $records[0]['Duration'];  // get the first record [0] and the Duration column ['Duration'] from the first record

来自phpmyadmin的(显示个人资料)的结果。

Query_ID    Duration    Query   
1           0.00010575  SELECT DATABASE()

Getting the actual (absolute) execution time of the last query in PHP (excluding network latency etc)

答案 1 :(得分:4)

这个怎么样:

$start = microtime(true);
$stmt->execute();
$end = microtime(true);
echo "This query took " . ($end - $start) . " seconds.";