Intereting Posts
Как интегрировать слайд видео с использованием пользовательских типов сообщений? Как вставить ссылку на почтовый архив по умолчанию в меню Обновление плагина при сохранении совместимости с обратной связью: общий используйте query_posts для возврата сообщения ИЛИ страницы с идентификатором Как связать «читать дальше» о взломе выписок из WP Recipies Нет файла журнала ошибок, нет информации об отладке Публичная (Non-Admin) должность Редактировать / просмотреть историю Программно добавлять сообщения, добавлять и назначать postmeta и назначать условия Создать виджет для использования короткого кода? Замена mysql_escape_string в настраиваемом плагине при переходе на PHP7 Отображать запрос с несколькими типами сообщений и одинаковыми отношениями на одной странице Установите размер изображения для персонализированного типа сообщения. Как показать postmeta в пользовательских столбцах для экрана сообщений? URL-адреса изображений не перенаправляются должным образом Недостаточно памяти при загрузке изображения

Блог WordPress с 30 000 сообщений: плохая эффективность поиска

Наш блог WordPress работал нормально, пока мы не импортировали около 30 тыс. Сообщений. После этого поиск на веб-сайте стал очень медленным.

Теперь он принимает:
– 4 секунды, чтобы загрузить страницу с помощью виджета «Поиск и фильтр».
– 18 секунд для возврата результатов поиска.

Основные плагины, которые мы используем:
Пользовательские типы сообщений – у нас есть только один тип сообщений, который используется в блоге.
Расширенные настраиваемые поля – у нас есть набор настраиваемых полей, которые можно искать и фильтровать.

Поиск плагинов, которые мы используем:
Искать все – у нас есть метки, авторы и комментарии для поиска. По умолчанию контент, заголовок и настраиваемые поля доступны для поиска.
Search & Filter Pro – используется для создания нашего виджета поиска и фильтрации и установки правил фильтрации.

Кэширование:
Мы используем Memcache как подключаемый кэш для WP, а также постоянное решение кеша.

Окружающая среда:
Физический сервер: AWS t2.small; 2 ГБ памяти; Ядро CPU 1 до 3,3 ГГц
ОС: Windows Server 2012
Веб-сервер: IIS 8.5
PHP 5.6.22
WordPress 4.6.1 MySQL 5.6.27 (выделенный экземпляр RDS)

У нас довольно ограниченная база пользователей и не наблюдается значительных всплесков в использовании ресурсов сервера как для сервера приложений, так и для сервера db.

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

SELECT SQL_CALC_FOUND_ROWS distinct wp_posts.ID FROM wp_posts LEFT JOIN wp_postmeta ON wp_posts.id = wp_postmeta.post_id LEFT JOIN wp_term_relationships AS trel ON ( wp_posts.id = trel.object_id ) LEFT JOIN wp_term_taxonomy AS ttax ON ( ( ttax.taxonomy = 'post_tag' ) AND trel.term_taxonomy_id = ttax.term_taxonomy_id ) LEFT JOIN wp_terms AS tter ON ( ttax.term_id = tter.term_id ) LEFT JOIN wp_comments AS cmt ON ( cmt.comment_post_id = wp_posts.id ) LEFT JOIN wp_users AS u ON ( wp_posts.post_author = u.id ) WHERE 1 = 1 AND ( ( wp_posts.id IN (<LIST_OF_POST_IDS>) AND (( (( ( wp_posts.post_title LIKE '%searchterm%' ) OR ( wp_postmeta.meta_value LIKE '%searchterm%' ) OR ( wp_posts.post_content LIKE '%searchterm%' ) )) OR (( tter.name LIKE '%searchterm%' )) OR ( (( cmt.comment_content LIKE '%searchterm%' )) AND cmt.comment_approved = '1' ) OR (( u.display_name LIKE '%searchterm%' )) )) AND wp_posts.post_type = 'generalpost' AND (( wp_posts.post_status = 'publish' )) ) AND post_type != 'revision' ) AND post_status != 'future' ORDER BY wp_posts.post_date DESC LIMIT 0, 15; 

См. Документацию к WordPress DB для ссылки на схему

Этот запрос отвечает за около 65% времени загрузки страницы результатов поиска (12 секунд из 18 секунд)

На данный момент у нас только 1 пользовательский тип сообщения, и только это нужно для поиска. Каждый пользовательский тип сообщения имеет 18 записей в wp_postmeta. Из этих 18 полей только 4 должны быть доступны для поиска – и это один из возможных способов ускорить поиск.

В моих тестах, добавляющих этот пункт

 `AND meta_key in ('cust_field1', 'cust_field2', 'cust_field3', 'cust_field4',)` 

фактически ускорил запрос почти в два раза. Разработчики плагинов были проинформированы о реализации функции поддержки исключения метаданных.

Я также создал составной индекс столбцов post_id, meta_key, meta_value , которые сократили время запроса еще на 5-10%.

Какими были бы другие способы сделать поиск с таким количеством данных более эффективным, чтобы пользовательский интерфейс не был разрушен?

Solutions Collecting From Web of "Блог WordPress с 30 000 сообщений: плохая эффективность поиска"

Похоже, вы уже на правильном пути, добавляете дополнительные индексы и настраиваете запрос. Я нашел синтаксис MySQL EXPLAIN полезным , давая мне хорошее представление о том, где в запросе могут возникнуть проблемы.

С высокого уровня кажется, что в запросе много связанных таблиц, сравнение LIKE (с подстановочными знаками) и OR компараторы, все из которых являются симптомами потенциально менее эффективных запросов. Я бы удостоверился, что каждый из этих столбцов проиндексирован правильно (особенно те, которые, возможно, обычно не запрашиваются), и убедитесь, что вы там что-то пропустили.

Общий размер базы данных может быть фактором в некоторых средах; в какой-то момент клиентский сайт жаловался на медленную производительность (а не только на поиск), и мы обнаружили, что индексы захлебывались тем фактом, что около 20% базы данных состояло из почтовых исправлений (это был ежедневный новостной сайт, поэтому пересмотры на посту с шести месяцев назад не было действительно актуальным). Revision Strike родилась из этой необходимости и оказала огромное влияние на общее, а также на результаты поиска.

Еще один способ рассмотреть – это нечто, основанное на более специализированной технологии поиска. ElasticPress (полное раскрытие: я работаю в 10up, разработчик ElasticPress) связывает Elasticsearch с запросами WordPress, значительно уменьшая нагрузку на ваш веб-сервер, позволяя делать более сложные поисковые запросы (например, вы, похоже, работаете со своими поисковыми плагинами) ,