Количество запросов MySQL, выполняемых на странице

как я могу подсчитать количество запросов sql, выполняемых при загрузке одной страницы?

У меня есть аналогичное script время, которое требуется для создания страницы, но не для того, сколько запросов было выполнено.

Вы знаете, что я имею в виду, например, на форумах SMF, в нижнем колонтитуле:

Страница создана за 0.136 секунд с помощью 7 запросов.

в нижнем колонтитуле?

Замена всех mysql_query (ies) на самом деле не является опцией, существует слишком много mysql_queries для замены, хотя я мог бы потратить на это день, если это необходимо.

Спасибо

Ответ 1

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

SHOW SESSION STATUS LIKE 'Questions'

Ответ 3

Я думаю, что следующая команда подсчитывает количество сеансов:

SHOW STATUS LIKE 'com_select%'

Ответ 4

Вы можете получить количество запросов, когда-либо выполнявшихся при вызове.

show session status like "Queries";

Назовите это в начале и в конце создания страницы, а затем вы увидите, сколько запросов было. Не забывайте, что сама эта команда также считается одной.

Ответ 5

Вот пример, который может быть проще выполнить, чем 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.';

Ответ 6

После комментария Quassnoi я поставлю это в начале script:

$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

Ответ 7

Чтобы подсчитать количество запросов, вам нужно подсчитать количество запросов. Извините, что звучит излишним, но это действительно так просто.

Сделайте функцию подсчета (mysql_query_counted?), затем используйте grep для поиска через вашу кодовую базу для mysql_query(, и она не должна занимать больше часа или двух. Возможно, даже подумайте об использовании sed или аналогично замене вызовов функций.

Примечание по SMF и тому подобное, которые имеют этот встроенный модуль. Они используют уровни абстракции БД, поэтому они уже используют свою собственную функцию query, и добавление подсчета запросов на более позднюю дату было бы таким же простым, как добавление строки, увеличивающей счетчик к этой функции. +1 для абстракции и инкапсуляции. Я полагаю.