SqlMon: плагин для анализа SQL-запросов
Поиск слабых мест производительности: анализируем SQL-запросы
Меня всегда интересовало, насколько эффективно WordPress работает с базой данных, и насколько хорошо спроектирована база данных.
Практически в каждом проекте, над которым я работаю, я использую те или иные средства для анализа производительности скрипта и поиска его слабых мест. Для разработчиков не является секретом, что во многих случаях плохая производительность работы скрипта обусловлена низкой производительностью SQL-запросов. И, как правило, низкое быстродействие запросов связано с их неоптимальностью (что включает в себя отсутствие необходимых индексов в базе данных).
Однажды столкнувшись с ужасной производительностью WordPress и не имея возможности анализировать код десятка поставленных плагинов, я стал решать задачу иначе, в результате чего родился плагин для анализа SQL-запросов.
Принцип работы. Плагин устанавливает обработчики действий, которые позволяют перехватить запрос к базе данных непосредственно перед его выполнением. Если перехваченный запрос — SELECT
, UPDATE
или DELETE
, то скрипт пытается его "объяснить" — выполнить EXPLAIN
над запросом. Предвидя возражения, что EXPLAIN
работает только с SELECT
, но никак не с DELETE
и UPDATE
, поясняю: запросы DELETE
и UPDATE
переписываются в SELECT
, например:
FROM `t1`
INNER JOIN `t2`
ON `t1`.`id` = `t2`.`id`
WHERE `t2`.`key` = 'value'
LIMIT 5
будет переписан в
FROM `t1`
INNER JOIN `t2`
ON `t1`.`id` = `t2`.`id`
WHERE `t2`.`key` = 'value'
LIMIT 5
Возможно, переписывание работает не всегда, но такие случаи мне еще не встречались
Я предполагаю, что Вы понимаете, для чего нужен EXPLAIN
и как следует понимать результаты, которые он выдаёт. Если это не так, то очень рекомендую прочитать статью "Optimizing Queries with EXPLAIN", а затем вернуться к данной статье.
Плагин в футере темы (кстати, это относится и к админке) выдаст подробный лог запросов с их объяснением. Это может выглядеть примерно так:
Установка. К сожалению, установка данного плагина полностью не автоматизируется: кое-что надо делать вручную. После активации плагина в WordPress нужно выполнить следующие действия:
- Добавить в файл
/wp-config.php
следующие строки:[-]View Code PHPdefine('SQLMON_ENABLED', true);
$sqlmon_allowed_ips = array('70.87.222.86'<span class="sy0"