Рейтинг@Mail.ru


Анализ SQL запросов WordPress

Владельцы и администраторы блогов WordPress часто сталкиваются с тем, что после установки новых плагинов или написании собственных снижается скорость работы всего сайта. Зачастую это связано с избыточным количеством посылаемых скриптами SQL-запросов в базу данных. Иногда перед некоторыми становится дилемма — какой из плагинов выбрать, если у нескольких из найденных схожий функционал. Чтобы решить эти проблемы, найти наиболее рационально работающие скрипты, плагины или даже темы, необходимо провести анализ и определить, какие из скриптов посылают очень много или достаточно мало SQL запросов, сколько времени занимает их выполнение.
Отладка и анализ SQL запросов WP

WordPress предоставляет возможность записи SQL запросов для их последующего анализа и отладки — это именованная константа SAVEQUERIES, которую нужно объявить в файле настроек WP wp-settings.php вот таким образом:

define( 'SAVEQUERIES', true );

После того, как константа SAVEQUERIES определена, и активирована, то есть ей установлено значение константа true, WordPress сразу же начнет запоминать буквально все SQL-запросы к базе данных при каждом обращении посетителя (например Вас) к страницам сайта. Информация о запросах будет сохраняться в определенном массиве (точнее массиве масивов).

Чтобы увидеть какие SQL-запросы и в каком порядке выполнялись, можно в файле footer.php вашей текущей темы разместить следующий код:

<?php
	if ( current_user_can( 'administrator' ) ) {
		global $wpdb;
		echo "<pre>";
		print_r( $wpdb->queries );
		echo "</pre>";
	}
?>

Этот код должен быть расположен да закрывающего тега </body>. Теперь, когда код добавлен, при каждом обновлении страниц сайта, в самой нижней его части будет выводиться информация об SQL запросах. Там же будет отображаться время, затраченное на выполнение каждого запроса, имена файлов и их функций, используемые для SQL запросов.

Array
(
    [0] => Array
        (
            [0] => SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
            [1] => 0.003000020980835
            [2] => require('...\wp-blog-header.php'), require_once('D:\OpenServer\domains\wp360.qa\wp-load.php'), require_once('...\wp-config.php'), require_once('...\wp-settings.php'), wp_not_installed, is_blog_installed, wp_load_alloptions
        )

    [1] => Array
        (
            [0] => SELECT * FROM wp_users WHERE user_login = 'admin'
            [1] => 0.00099992752075195
            [2] => require('...\wp-blog-header.php'), require_once('D:\OpenServer\domains\wp360.qa\wp-load.php'), require_once('...\wp-config.php'), require_once('...\wp-settings.php'), WP->init, wp_get_current_user, get_currentuserinfo, wp_validate_auth_cookie, get_user_by, WP_User::get_data_by
        )
	
	и так далее...

Теперь, опираясь на получаемую информацию, можно будет проводить анализ SQL запросов WordPress и вносить соответствующие изменения в скрипты (если Вы их сами пишите) для того, чтобы по возможности уменьшить количество запросов, что в последствии скажется на скорости работы вашего сайта или блога. Кроме этого можно анализировать и SQL запросы, выполняемые плагинами, чтобы выбрать для себя наиболее быстро работающий плагин (который посылает в базу данных меньше запросов) из нескольких, выполняющих одинаковые функции.

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

Чтобы решить эту проблему, предлагаю вашему вниманию адаптированный вариант скрипта для вывода на экран результатов работы сборщика SQL-запросов, который написал для себя и сам его использую:

<?php
if ( current_user_can( 'administrator' ) ) {
	global $wpdb;

	echo '<br /><br />########## SQL запросы ##########<br /><br />';
	echo '<span style="margin-left: 10px;"><b>';
	echo 'Количество SQL-запросов = ' . sizeof($wpdb->queries);
	echo '</b></span><br />';

	$sqlstime = 0;
	foreach ( $wpdb->queries as $qrarr ) {
		$sqlstime += $qrarr[1];
	}

	echo '<span style="margin-left: 10px;"><b>';
	echo 'Затрачено времени = ' . round( $sqlstime, 4 ) . ' секунд';
	echo '</b></span><br /><br />';

	foreach ( $wpdb->queries as $qrarr ) {
		echo '<span style="color: blue;margin-left: 10px;">SQL-запрос = </span>' . $qrarr[0] . '<br />';
		echo '<span style="color: blue;margin-left: 10px;">Время выполнения = </span>' . round( $qrarr[1], 4 ) . ' секунд<br />';
		echo '<span style="color: blue;margin-left: 10px;">Файлы и функции: </span><br />';
		$filesfunc = split( ",", $qrarr[2] );
		foreach ( $filesfunc as $funcs ) {
			echo '<span style="margin-left: 20px;">+ ' . $funcs . '</span><br />';
		}
		echo '<br />';
	}

	echo '<br />########## END: SQL запросы ##########<br /><br />';
}
?>

Результат работы этого скрипта будет выглядеть примерно так (время выполнения запросов на картинке мизерное, не такое конечно же, как на хостингах с бюджетными тарифными планами, т.к. картинку снимал на локальном сервере):

Лог SQL запросов WordPress

Теперь уже более удобно — в начале сразу же видно, сколько было выполнено запросов к базе данных и сколько на это было затрачено времени, да и функции с файлами уже не склеиваются в одну строку, что более удобно для нанализа SQL запросов.

Кстати, это скрипт Вы можете использовать даже на действующем сайте, ведь отчет об SQL-запросах будет виден только администратору, так как собственно весь скрипт заключен в условие:

if ( current_user_can( 'administrator' ) ) {

Внимание!
Используйте приведенный в пример скрипт и константу SAVEQUERIES в файле конфигурации wp-settings.php только во время отладки вашего сайта и анализа SQL запросов! Не используйте их, когда сайт работает в обычном режиме и доступен посетителям.

Функция WordPress, которая производит запись всех запросов, добавит нагрузку на сервер SQL и будет прилично замедлять работу вашего сайта в целом. Поэтому по окончании анализа и отладки обязательно установите для константы SAVEQUERIES значение false, или даже закомментируйте ее, или вообще удалите из файла wp-settings.php. То же самое сделайте и со скриптом в файле footer.php, который выводил на экран статистику.

 

Метки: SQL, WordPress, анализ, запрос, отладка

Поделитесь материалом с другими, воспользуйтесь этими кнопками:
Получать обновления и новые материалы блога по E-mail

5 комментариев к “Анализ SQL запросов WordPress”

  1. pilat:

    Ну вот есть сайт, есть необходимый для него функционал, ничего нельзя менять. Что даст нам количество обращений?
    Статистику нужно смотреть на сервере и если не хватает ресурсов, расширять функционал там, а не ограничивать задуманную функциональность.

    • Согласен, раз уж 100% нельзя ничего менять, то естественно выход один — менять либо тарифный план хостинга, либо вообще сервер, если сайт медленно работает.

      А кроме количества обращений скрипт покажет еще и время выполнения каждого запроса. По результатам которых можно будет оценить насколько хорош или слаб SQL-сервер. Возможно это даст толчок к тому, что нужно оптимизировать базу данных или опять же — менять сервер.

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

  2. Юрий:

    Здравствуйте, Владимир!
    1. Поправьте Ваш код в строках 7 и 16.
    2. Как правильно проводить анализ результатов статистики?

    • Юрий,
      спасибо за замечание — ошибки в коде поправил, видимо из бэкапа взялся «черновой» вариант во время вчерашней правки статьи.

      О какой статистике Вы спрашиваете?
      Если о статистике на сервере, то например в phpMyAdmin есть в меню кнопки (или ссылки) «Состояние» и «Процессы». Вот кликнув по ним Вы можете попасть в отчеты, где много данных, особенно в разделе «Состояние». И по этим данным можно выяснить слабые стороны работы либо ваших скриптов, либо сервера SQL. Кроме этого можно просматривать логи записей обращений скриптов к базе данных.

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

  3. Александр:

    Занятная статья. Я так понимаю с помощью этого кода можно определить не только скрипты, но и плагины которые делают SQL запрос, благодаря чему эти плагины можно заменить на альтернативные.

Оставить комментарий

Уважаемые посетители, пожалуйста, пишите осмысленные и исчерпывающие комментарии. Короткие фразы типа «спасибо автору», «возьму на заметку», «мне помогло» и т.п. будут удаляться. Исключение, когда Вы отвечаете на чей-то вопрос или благодарите за помощь.

Для вставки кода в комментарии можно использовать BB-коды:
[text] [/text], [php] [/php], [html] [/html]

Подписаться на обновления блога 4remind.ru по RSS
Новости блога в социальных сетях

4remind.ru - персональный блог вебмастера

Rambler's Top100
Рейтинг@Mail.ru


Наверх
Наверх
Яндекс.Метрика