как я могу подсчитать количество запросов sql, выполняемых при загрузке одной страницы?
У меня есть похожий скрипт на время, которое требуется для создания страницы, но не для того, сколько запросов было выполнено.
Вы знаете, что я имею в виду, например, на форумах SMF, в нижнем колонтитуле они имеют:
Страница сгенерирована за 0.136 секунд с помощью 7 запросов.
в нижнем колонтитуле?
Замена всех mysql_query (-ов) на самом деле не является опцией, есть слишком много mysql_queries для замены, хотя я мог бы потратить на это день, если это необходимо.
благодаря
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.
SHOW SESSION STATUS LIKE 'Questions'
Я думаю, что следующая команда подсчитывает количество сеансов:
SHOW STATUS LIKE 'com_select%'
Вы можете получить количество запросов, когда-либо выполняемых при вызове.
show session status like "Queries";
Назовите это в начале и в конце создания страницы, а затем вы увидите, сколько запросов было. Не забывайте, что сама эта команда также считается одной.
Вот пример, который может быть проще, чем 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.';
После комментария 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
Чтобы подсчитать количество запросов, вам нужно подсчитать количество запросов. Извините, что звучит излишне, но все так просто.
Сделайте функцию подсчета ( mysql_query_counted
?), Затем используйте grep для поиска через вашу кодовую базу для mysql_query(
и она не должна занимать больше часа или двух. Возможно, даже подумайте об использовании sed
или аналогичных для замены вызовов функций.
Замечание по SMF и тому подобное, которые имеют этот встроенный модуль. Они используют уровни абстракции БД, поэтому они уже используют свою собственную функцию query
, и добавление подсчета запросов на более позднюю дату было бы таким же простым, как добавление строки, увеличивающей счетчик к этой функции. +1 для абстракции и инкапсуляции.