Ars Longa, Vita Brevis

Поиск слабых мест производительности: анализируем SQL-запросы

Меня всегда интересовало, насколько эффективно WordPress работает с базой данных, и насколько хорошо спроектирована база данных.

Практически в каждом проекте, над которым я работаю, я использую те или иные средства для анализа производительности скрипта и поиска его слабых мест. Для разработчиков не является секретом, что во многих случаях плохая производительность работы скрипта обусловлена низкой производительностью SQL-запросов. И, как правило, низкое быстродействие запросов связано с их неоптимальностью (что включает в себя отсутствие необходимых индексов в базе данных).

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

Принцип работы. Плагин устанавливает обработчики действий, которые позволяют перехватить запрос к базе данных непосредственно перед его выполнением. Если перехваченный запрос — SELECT, UPDATE или DELETE, то скрипт пытается его "объяснить" — выполнить EXPLAIN над запросом. Предвидя возражения, что EXPLAIN работает только с SELECT, но никак не с DELETE и UPDATE, поясняю: запросы DELETE и UPDATE переписываются в SELECT, например:

[-]
View Code MySQL
DELETE `t1`
    FROM `t1`
        INNER JOIN `t2`
            ON `t1`.`id` = `t2`.`id`
    WHERE `t2`.`key` = 'value'
    LIMIT 5

будет переписан в

[-]
View Code MySQL
EXPLAIN SELECT *
    FROM `t1`
        INNER JOIN `t2`
            ON `t1`.`id` = `t2`.`id`
    WHERE `t2`.`key` = 'value'
    LIMIT 5

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

Я предполагаю, что Вы понимаете, для чего нужен EXPLAIN и как следует понимать результаты, которые он выдаёт. Если это не так, то очень рекомендую прочитать статью "Optimizing Queries with EXPLAIN", а затем вернуться к данной статье.

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

Скачать SqlMon.

Установка. К сожалению, установка данного плагина полностью не автоматизируется: кое-что надо делать вручную. После активации плагина в WordPress нужно выполнить следующие действия:

  1. Добавить в файл /wp-config.php следующие строки:
    [-]
    View Code PHP
    define('SQLMON_ENABLED', true);
    $sqlmon_allowed_ips = array('70.87.222.86'<span class="sy0"