Количество запросов 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 для абстракции и инкапсуляции. Я полагаю.