ГлавнаяПлагиныОтладка SQL запросов в WordPress с помощью Query Monitor

Отладка SQL запросов в WordPress с помощью Query Monitor

При работе с такими API как WP_Query, Options, Metadata или с базой данных напрямую через объект $wpdb, важно помнить, что каждый SQL запрос влияет на время загрузки сайта. Плагин Query Monitor покажет вам все запросы в базу данных на текущей странице, их источник, время выполнения и многое другое.

Плагин Query Monitor

Плагин Query Monitor

После установки плагина Query Monitor в верхней панели WordPress появится новое меню, которое сразу отображает время генерации страницы, пиковое потребление памяти, время потраченное на все SQL запросы и количество запросов в базу данных MySQL на текущей странице.

Подобная информация поможет сразу понять насколько тяжелой является текущая страница для сервера. Для сравнения, свежая установка WordPress потребляет порядка 18 мб памяти, около 20 SQL запросов за 3 миллисекунды и в среднем 250 миллисекунд для генерации главной страницы.

При переходе в раздел Queries можно увидеть список всех SQL запросов в базу данных, их источник, компонент, количество найденых строк и время исполнения каждого запроса. Список легко отфильтровать по значениям Caller и Component.

Список SQL-запросов

Список SQL-запросов

Если вы заметили что какой-то из запросов в вашем коде занимает слишком много времени, или вызывается слишком часто, то возможно стоит оптимизировать функцию, которая его вызывает или же сам запрос. Начинать оптимизацию SQL запросов мы советуем с функции EXPLAIN в вашей консоли MySQL или phpMyAdmin.

Кроме SQL-запросов в плагине Query Monitor есть разделы с условными тегами, с параметрами запроса WP_Query, со списком всех событий и фильтров на текущей странице и многое другое. Одной из самых интересных функций данного плагина является возможность установить специальный Cookie, который позволит просматривать информацию от имени любого пользователя или анонимно.

Плагин Query Monitor является бесплатным, распространяется под лицензией GPL и доступен в официальной директории плагинов на сайте WordPress.org. Если вы ищите альтернативы или другие инструменты для отладки в WordPress, не забудьте попробовать плагин Debug Bar.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • versusbassz

    Спасибо за статью, попробую.

    Есть опечатка: «Начинать оптимизацию SQL запросы мы советуем с функции»
    Правильно: «Начинать оптимизацию SQL запросов мы советуем с функции»

    • Спасибо, исправили.

  • MrClon

    Шикарно, пойду тестировать!
    Логгирование запросов и ответов понятное дело само порождает некоторую нагрузку. Отсюда вопрос: плагин собирает информацию только по запросам порождённым определёнными посетителями?

    P.S. возможно кому-то будет интересна утилита mysql-proxy. Эта утилита прогоняет через себя обмен данными между mysql клиентом и сервером и может его обрабатывать, при-чём обработка задаётся скриптом на языке Lua (похож на JS) так-что видимо делать с запросами/ответами можно что угодно.

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

  • MrClon

    О сколько нам открытий чудных… Оказывается БД вносила довольно незначительный вклад во время генерации страницы (только два плагина «отличились», да и то немного, «GD Star Rating» (его вообще странные люди писали) и AVH Extended Categories Widgets). Основной проблемой оказалась реализация gravatar из плагина WP User Avatar (не знаю подвержена-ли этому стандартная реализация WP (не уверен даже что она есть)), он при каждом запросе страницы с аватарами делал get запрос на сервера граватара для каждого не определённого аватара на странице. Мрак. Отключил ерись, время генерации снизилось на три четверти (программистам на заметку: сеть это очень медленно и ненадёжно, любая, всегда).

    Ещё и куча варнингов… Впрочем это на тестовой версии сайта, она с боевой давно не синхронизировалась, и между ними накопилась большая разница (в тестовой версии осталась масса хвостов от моих экспериментов). Ночью всё-таки посмотрю то-же самое на боевом сайте.

    • Да, при работе с парой крупных проектов сталкивался с WP User Avatar и с GD Star Rating, оба плагина многие вещи делают не совсем правильно. Реализация Gravatar в ядре WordPress таких проблем не имеет.

      • MrClon

        Может посоветуете что-то для профилирования phpшной части WP?

        • Знаете, у нас пост в черновиках как раз на эту тему, постараемся опубликовать его на этой неделе :)

          • Алексей Мотовилов

            Ждем :-)

          • dimasmagadan

            о, если можно оставлять заявки на тематику будущих постов, то было бы интересно почитать про оптимизацию запросов к wp_postmeta
            для выборок вот такого типа:
            [code]
            $args = array(

            ‘relation’ => ‘AND’,
            ‘meta_query’ => array(
            array(
            ‘key’ => ‘rating’,
            ‘value’ => array(3, 4),
            ‘type’ => ‘numeric’,
            ‘compare’ => ‘BETWEEN’,
            ),
            array(
            ‘key’ => ‘votes’,
            ‘value’ => 50,
            ‘type’ => ‘numeric’,
            ‘compare’ => ‘>=’,
            )
            )
            );
            $query = new WP_Query($args);
            [/code]

          • @dimasmagadan про meta_query мы уже писали, причем достаточно подробно, и тему производительности затронули. В комментариях есть так же интересная информация для размышления. Если будут вопросы — пишите!

          • dimasmagadan

            Эту статью видел. Показалось, что там только перепечаткаперевод документации
            По производительности советуется в основном так «настало время подключать внешнюю систему индексирования и поиска, например Sphinx или Elasticsearh». что не подходит (сайт на хостинге с старым ПО, обновитьсменить хостинг нельзя).

            в интернетах рекомендуют добавить индексы еще и вот так
            ALTER TABLE `wp_postmeta` ADD INDEX USING BTREE (meta_value(255));
            пишут, удалось ускорить в 3.5 раза, но тут же добавляют, что решение не идеальное.

            База больше гигабайта, вордпресс-часть примерно на 200мб, хочу делать выборки по 3-4 параметрам через meta_query. Использовать вместо произвольных полей таксономии не подходит.
            Сейчас делаю выборку только по одному полю. По нескольким тормозит.
            Ищу возможные способы ускорения запроса, без изменения структуры таблиц, установки дополнительного софта на сервер. Как-то так)

          • Сайт на хостинге с старым ПО, обновитьсменить хостинг нельзя

            Боюсь у вас куда более важная проблема, чем запросы с мета-данными без изменения структуры таблиц :)

          • dimasmagadan

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

            Поэтому, как и на погоду за окном, на эту проблему решено не обращать внимание — придет весна (широкополосный интернет), снег растает (сменим хостинг, обновим ПО).

        • versusbassz

          xhprof

      • MrClon

        А есть-ли способ без мороки заменить WP User Avatar на что-то более вменяемое с сохранением уже выбранных пользователями аватаров?

        Или лучше не напрягаться поиском простого способа и сразу напрячься реализацией способа очевидного, но замороченного? Дампнуть нужные данные и влить обратно уже в новом формате.

        Порой на поиск более простого пути уходит больше сил чем требует путь сложный.

        И что посоветуете вместо WP User Avatar? Нужна установка аватаров пользователями, identicon и никаких запросов к внешним серверам (ну или какая-то волшебная реализация таких запросов которая не вносит ощутимого замедления).

        • Я пока альтернативы не встречал, ну и особо не искал. Сервисы типа Gravatar и Identicon не делают запросов на внешние ресурсы с вашего сервера. Эти запросы выполняет клиент, поэтому на скорость работы вашего сервера и сайта это не влияет, но есть и ограничения, например Gravatar нельзя использовать во внутренней сети без выхода в Интернет.

          WP User Avatar плох тем, что он неправильно работает с сервисом Gravatar и делает к нему HTTP запросы с самого сервера, тем самым если у вас на странице 300 комментариев, то ваш сервер сделает 300 HTTP запросов :)

          Если найдете хорошую альтернативу — дайте знать!

  • Алексей Мотовилов

    Крутая вещь, спасибо!

  • Спасибо за плагин, уже оптимизировал несколько функций и пофиксил пару ошибок. GD Star Rating и Old Post Promoter «отличились», но без них пока нельзя.

  • Интересный плагин :) как я уже упомянул, более простое это Sphinx/Elasticsearch.

    • dimasmagadan

      сфинкс и прочее не подходит :(

      сайт расположен на хостинге в Магадане. интернет в городеобласти дорогой, только через спутник, до сих пор процветают локальные сети. Поэтому основная масса пользователей — с местных локальных сеток.
      Конкурентовальтернативы хостеру нет. ВОЛС в область обещают уже который год как «вот в следующем году точно». Как-то мотивировать хостера обновить софт на сервере так же проблематично. Отсюда только старая версия php и всего остального.
      Подбирать версию сфинкса, которая запустится с хостингом у меня знаний не хватит.

      Проще видится переписать на использование дополнительных таблиц.
      В общем, печаль, уныние и безысходность :)

      Но за статью все равно спасибо, статья помогла найти плагин. Под свои проекты писать много кода лениво, часть кода скопипастю с плагина)

      • Альтернативы для хостинга всегда есть. Даже если сервер находится не настолько близко географически как вам хочется, это куда безопаснее чем местный устаревший и уязвимый провайдер.

        • dimasmagadan

          дело не в географической удаленности :(
          в городе очень развиты локальные сети. трафик к серверу по этим сетям не тарифицируется.
          сервер жеж физически находится «в локальной сети».

          основная масса аудитории — вот эти самые пользователи с «интранета»

          • Ясно. К сожалению я не могу вам больше ничего посоветовать :) очевидно содержать свой маленький сервер тоже не вариант…

          • dimasmagadan

            Вариант, но при этом оплата трафика перекладывается на нас. При цене в 3 рубля за мегабайт, дешевле будет распечатать сайт и ходить, вручать пользователям лично)

      • MrClon

        Ух, не думал что такое в России ещё осталось. Во последние годы оптоволоконные сети расползаются быстро. На самом деле из такой изолированности тоже можно извлечь профит — не нужно конкурировать во всем миром. Такой локальный сервис может очень даже неплохо развиться. Главное помнить что рано или поздно оптика к вам придёт, и тогда выживут только те кто успеет развиться достаточно что-бы конкурировать со всем миром.

        • dimasmagadan

          та большая часть Дальнего Востока так живет — Магаданская область, Чукотка, местами Камчатка.

          Планов на захват мира через текущий сайт нет. Трезво смотрю на ситуацию. Как появится ВОЛС у проекта останется едва ли 10я часть пользователей. Вкладывать в развитие спорно — больше пользователей, чем сейчас на сайте не будет. В виду ограниченного количества этих самых пользователей) Они и так сейчас все на сайте есть)

          А конкуренции да, в нише нет: крупные конкуренты «не конкуренты» в силу отсутствия доступа к их сайтам у пользователей, с ново-появившимися «локальными» сайтами конкурировать просто — хороших специалистов там нет, сайты делаются на уровне скачать движок, поставить шаблон, функционал у таких сайтов от стандартного практически не отличается.
          Местным пользователям, в общем, деваться особо некуда, кому интересна тематика пользуются тем, что есть.

          У меня там сайт авто-тематики на WordPress с объявлениями. Так фильтр по цене на сайте я включил только этим летом. Висела реклама с оплатой за к-во просмотров, поэтому пользователям приходилось просматривать все страницы. Как рекламодатель сменил тип оплаты, устроил праздник пользователям — добавил фильтры).

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

          Совесть вот временами мучает, собираюсь как-нить взять и переписать) Но пока руки доходят только до мелких периодических правок. Те же правки какие-то внести тоже не просто. В прошлый раз 6 кб файл минут 40 заливался (подключаюсь по SCP, с компресией, клиент докачку поддерживает, но все равно не лезет). На днях вот провайдер внезапно перенастроил фаервол, мой ip оказался в блэк листе. Сейчас у них там уже суббота, что-то поменять получится не раньше понедельника-вторника)

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

          • dimasmagadan

            такой вот небольшой комментарий в виде экскурса на Колыму получился
            больше офтопить не буду)

  • Sidom

    Круто!!!
    Спс за пост)

  • Atapys

    подскажите, а как вынести инфу если админ бар скрыт?

    • Вы можете включить отображение панели в настройках вашего профиля.