Intereting Posts
Как сгенерировать список дочерних страниц и использовать некоторые из своих настраиваемых полей? Значение $ _GET теряет пространство Сохранение пользовательского поля в окне приложения в WordPress 3.5 Пользовательский тип сообщения и ошибка повторной регистрации таксономии Пользовательская форма, в которой хранятся данные в базе данных Как создать галерею изображений с помощью wp-cli? Записи с сообщениями, которые содержат по крайней мере 3 тега текущего сообщения Выберите min / max meta из запроса Почему только одна страница реагирует? Различать сообщения и страницы в результатах поиска Помимо редактирования меню боковой части виджета, с php-страницей, настраиваемый шаблон Файл Sitemap_index.xml не отображается Как перемещать эскизы изображений в пользовательскую папку для пользовательского типа сообщения Добавление пользовательских значений в Permalinks через пользовательские поля и сообщения Ошибка пользовательского типа сообщения: попытка получить свойство не объекта

Улучшение или оптимизация очень медленного запроса

У меня довольно большая база данных – 113 299 строк в wp_posts и 216 064 строк в wp_postmeta.

Существует один пользовательский запрос, который я запускаю после добавления или редактирования сообщения, которое появляется в файле медленного журнала MySQL каждый раз, когда он запускается – и, похоже, занимает слишком много секунд (от 17 до 78 секунд, по сути).

Это то, что похоже на query_posts :

  $args = array( 'meta_query' => array( array( 'key' => 'article_template', 'value' => 'news', ), ), 'posts_per_page' => '30', 'category__in' => array( 3, 4, 5 ), 'post_status' => 'publish', 'no_found_rows' => true, 'orderby' => 'meta_value', 'meta_key' => 'article_datetime', 'order' => 'DESC' ); query_posts( $args ); 

И это похоже на файл медленного журнала MySQL:

 SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (3,4,5) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.meta_key = 'article_datetime' AND (mt1.meta_key = 'article_template' AND CAST(mt1.meta_value AS CHAR) = 'news') ) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 30; 

Это показывает EXPLAIN для этого запроса:

 mysql> explain SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) -> INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (3,4,5) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.meta_key = 'article_datetime' AND (mt1.meta_key = 'article_template' AND CAST(mt1.meta_value AS CHAR) = 'news') ) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 30; +----+-------------+-----------------------+--------+--------------------------+----------+---------+-----------------------------+-------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------------------+--------+--------------------------+----------+---------+-----------------------------+-------+----------------------------------------------+ | 1 | SIMPLE | wp_postmeta | ref | post_id,meta_key | meta_key | 768 | const | 98576 | Using where; Using temporary; Using filesort | | 1 | SIMPLE | wp_posts | eq_ref | PRIMARY,type_status_date | PRIMARY | 8 | toi_web.wp_postmeta.post_id | 1 | Using where | | 1 | SIMPLE | mt1 | ref | post_id,meta_key | post_id | 8 | toi_web.wp_postmeta.post_id | 11 | Using where | | 1 | SIMPLE | wp_term_relationships | ref | PRIMARY,term_taxonomy_id | PRIMARY | 8 | toi_web.mt1.post_id | 2 | Using where; Using index | +----+-------------+-----------------------+--------+--------------------------+----------+---------+-----------------------------+-------+----------------------------------------------+ 

Поэтому мне интересно, есть ли у кого-нибудь хороший совет или предложение, как оптимизировать это и избежать медленного запроса? Может быть, сломать это в другой цикл query_posts ? Или сначала захватите идентификаторы сообщений с помощью простого wpdb->get_results ?

Я открыт для любых предложений 🙂

Кстати, у нас очень надежный кластер MySQL, поэтому серверные ресурсы не являются проблемой .

Solutions Collecting From Web of "Улучшение или оптимизация очень медленного запроса"