Вопрос или проблема
С 2017-09-26 у меня ужасные проблемы с производительностью на моем сайте.
Загрузка отдельного поста или любой другой страницы занимает даже 20 секунд. Я проводил отладку и выяснил, что проблемы связаны с запросами к БД.
Например, этот запрос выполняется почти при каждой загрузке страницы и занимает около 36 секунд:
SELECT t.*, tt.*, tr.object_id
FROM az2_terms AS t
INNER JOIN az2_term_taxonomy AS tt
ON t.term_id = tt.term_id
INNER JOIN az2_term_relationships AS tr
ON tr.term_taxonomy_id = tt.term_taxonomy_id
WHERE tt.taxonomy IN ('znacka', 'model')
AND tr.object_id IN (27130, 27290, 27822, 27899, 30862, 33536, 33721, 34901, 37448, 37482, 37496, 37522, 37572, 37580, 37742, 37750, 38160, 38165)
ORDER BY t.name ASC
Когда он выполняется во второй раз, это происходит почти мгновенно. С 2017-09-26 я не вносил никаких изменений, только переключился на HTTPS, может, это и есть проблема?
Относительно редко у WP возникают проблемы с производительностью запросов на небольших или средних сайтах:
- Запросы, которые он обычно выполняет, разумные (не идеальные, но разумные).
- Многое, что запрашивается, активно кэшируется в процессе загрузки страницы и сохраняется с помощью кэша объектов.
Хотя вы, безусловно, можете нагрузить кодом запросы, чтобы они замедлялись, 20 секунд кажется чрезмерным. Если только речь не идет о сотнях тысяч элементов.
Если изменение произошло внезапно, я бы сильно подозревал, что проблема на стороне сервера БД, и таблицы могут нуждаться в оптимизации/ремонте.
Если вы используете общий сервер с хорошим трафиком, нет смысла проводить исследования. Вам просто нужно перейти на VPS/облачный сервер.
Если это VPS/облачный сервер, такие внезапные странные задержки могут потребовать проверки вопросов безопасности. В общем, Fail2Ban достаточно, но вам нужно провести аудит безопасности, чтобы найти уязвимые плагины, вы должны протестировать различные вещи на VPS/облачном сервере, например, Высокую Доступность. Сделайте полный бэкап со всеми пользовательскими фрагментами/модификациями. Затем загрузите сайт без плагинов, без пользовательских фрагментов/модификаций, с темой по умолчанию.
Я не эксперт по базам данных, но предлагаю использовать Percona MySQL с движком InnoDB (MariaDB никак не близка к нему), отключить комментарии в WordPress и такие вещи, как пингбек, трекбек, использовать W3 Total Cache, отключить кэширование базы данных W3 Total Cache, включить кэширование MySQL и т.д. Я видел, что для WordPress тема сама по себе может быть как лучшей, так и худшей. Тема по умолчанию и StudioPress Genesis (платная) кажутся мне почти оптимальными.
Вам следует включить кэширование MySQL, что очень важно (статья Percona о кэшировании MySQL, моя статья о кэшировании MySQL) и протестировать различные настройки. Настройка базы данных из my.cnf
практична после порога для колокационных серверов, едва ли хороших выделенных серверов. Если оборудование работает медленно, ничего не поможет. Я бы посоветовал прочитать этот ответ на DB StackExchange для обеих частей — аппаратной и софтовой.
В комментарии к первому ответу вы спрашиваете: “Что такое 7692832 строки?” Это 7,692,832 строк, проверенных по вашему запросу. Вероятно, гораздо больше, чем вы ожидали.
Это могут быть 43 записи, найденные с одной стороны при соединении с 180,000 записями с другой стороны или что-то подобное. При соединениях это может накапливаться быстро.
Если у вас есть запросы на данные, которые не индексированы, вам придется делать сканирование таблиц для их нахождения. Очень медленно. Убедитесь, что у вас правильно индексифицированы нужные поля для ваших запросов. Попробуйте это для помощи.
Ответ или решение
Проблема производительности — медленный запрос к базе данных
Ситуация, с которой вы столкнулись, говорит о значительных проблемах с производительностью вашего веб-сайта, особенно учитывая время выполнения запроса в 36 секунд. Ниже приведены ключевые моменты, которые стоит учесть для диагностики и решения проблемы.
1. Анализ запроса
Запрос, который вы привели, выполняет объединение (JOIN) нескольких таблиц. Поскольку он взаимодействует с таблицами az2_terms
, az2_term_taxonomy
и az2_term_relationships
, следует обратить внимание на следующие моменты:
- Индексы: Проверьте, что поля
term_id
,taxonomy
, иobject_id
индексированы. Индексация может значительно ускорить процесс поиска и объединения данных, предотвращая полные сканирования таблиц. - Число строк: По вашим данным, запрос рассматривает 7 692 832 строки. Это довольно много, и отсутствие индексов может привести к необходимости проверять каждую строку, что приводит к сильному замедлению выполнения запроса.
2. Оптимизация базы данных
Если ваши таблицы не оптимизированы, потратите время на диагностику и оптимизацию:
- Проверка и оптимизация таблиц: Используйте команды
OPTIMIZE TABLE
иANALYZE TABLE
, чтобы улучшить производительность. - Переход на InnoDB: Как упоминалось ранее, использование механизмов хранения InnoDB может обеспечить лучшие результаты по производительности, особенно для операций с большими объемами данных.
3. Архитектура сервера
Следующий важный аспект — архитектура вашего сервера:
- Обменный трафик: Если ваш сайт хостится на общем сервере, возможно, у вас происходит конфликт ресурсов с другими сайтами. Рассмотрите возможность перехода на VPS или облачное решение, что обеспечит выделенные ресурсы для вашей базы данных.
- Проверка безопасности: Проведите аудит безопасности для выявления уязвимых плагинов, которые могут влиять на производительность.
4. Кэширование
Не забудьте об использовании кэширования, чтобы ускорить доставку данных:
- Кэширование запросов MySQL: Настройка кэширования может значительно снизить время отклика базы данных.
- Плагины кэширования в WordPress: Используйте такие плагины, как W3 Total Cache, но помните, что их неправильное использование может также вызвать проблемы. Попробуйте отключить базы данных кэширования и включить кэширование объекта.
5. Устранение неисправностей
Для диагностики также стоит временно отключить все плагины и переключиться на стандартную тему, чтобы исключить любые конфликты в коде:
- Тестирование с минимальным окружением: Это поможет определить, связано ли поведение с каким-либо конкретным плагином или темой.
- Мониторинг запросов: Используйте плагины, такие как Query Monitor, чтобы проанализировать, какие запросы выполняются и какие из них вызывают наибольшую нагрузку.
Заключение
Резюмируя, чтобы устранить проблему с производительностью, вам необходимо провести комплексный анализ запросов к базе данных, оптимизировать архитектуру сервера и использовать кэширование. Убедитесь, что у вас правильно настроены индексы и проведите аудит кода для выявления потенциально вредных плагинов. При правильном подходе вы сможете значительно улучшить производительность вашего веб-сайта и снизить время загрузки страниц до приемлемого уровня.