计算页面上执行的MySQL查询数

时间:2009-08-17 22:37:25

标签: php mysql

我如何计算在一个页面加载时执行的sql查询的数量?

我有一个类似的脚本来生成页面所花费的时间,但是没有执行了多少查询。

你知道我的意思,比如在SMF论坛上,在页脚中,他们有:

页面创建时间为0.136秒,包含7个查询。

在页脚?

替换所有mysql_query(ies)并不是一个真正的选择,有太多的mysql_queries需要替换,尽管我可以花一天的时间去做它。

由于

7 个答案:

答案 0 :(得分:12)

SHOW SESSION STATUS LIKE 'Questions'

答案 1 :(得分:7)

SMF通过拥有自己的自定义查询函数来进行查询计数:

function db_query($db_string, $file, $line)
{
    global $db_cache, $db_count, $db_connection, $db_show_debug, $modSettings;

    // One more query....
    $db_count = !isset($db_count) ? 1 : $db_count + 1;

    ...

实现你想做的最简单的方法就是做同样的事情;为mysql_query创建一个包装器并使用它而不是mysql_query。

答案 2 :(得分:3)

我认为以下命令是每个会话计数:

SHOW STATUS LIKE 'com_select%'

答案 3 :(得分:2)

您可以通过调用来获取执行的查询数量。

show session status like "Queries";

在页面创建的开始和结束时调用它,然后您可以看到已经有多少查询。不要忘记这个命令本身也算作一个。

答案 4 :(得分:2)

这是一个比SMF更容易遵循的例子。

class QueryLogger
{
    public $queries = array();

    public function query($sql)
    {
        $start = microtime(true);

        $query = mysql_query($sql);

        $queries[] = microtime(true) - $start;

        return $query;
    }

    public function getCount()
    {
        return sizeof($this->queries);
    }

    public function getTime()
    {
        return array_sum($this->queries);
    }
}

$queryLogger = new QueryLogger;
$query1 = $queryLogger->query('...');
$query2 = $queryLogger->query('...');
echo 'Ran '.$queryLogger->getCount().' queries in '.$queryLogger->getTime().' seconds.';

答案 5 :(得分:2)

Quassnoi 评论之后,我把它放在脚本的开头:

$res = mysql_query("SHOW SESSION STATUS LIKE 'Questions'");
$row = mysql_fetch_array($res, MYSQL_ASSOC);
define("START_QUERIES",$row['Value']);

和此:

$res = mysql_query("SHOW SESSION STATUS LIKE 'Questions'");
$row = mysql_fetch_array($res, MYSQL_ASSOC);
define("STOP_QUERIES",$row['Value']);

您可以通过以下方式查看总查询数:

echo "No of queries: ".(STOP_QUERIES-START_QUERIES-1);

我不知道为什么使用-1,也许它会计算mysql_select_db语句(或smth),但它在我的localhost上工作得很好

答案 6 :(得分:0)

要计算查询数,您需要计算查询数。很抱歉听起来多余,但确实很简单。

制作计数功能(mysql_query_counted?),然后使用grep在代码库中搜索mysql_query(,并且不应超过一两个小时。可能甚至考虑使用sed或类似的方法替换函数调用。

关于SMF及类似内容的说明。他们使用DB抽象层,因此他们已经在使用他们自己的query函数,并且在以后添加查询计数就像添加一个将计数器递增到该函数的行一样简单。我认为+1用于抽象和封装。

相关问题