Очень медленный запрос

Этот запрос работает, но он занимает 20 секунд для запуска на выделенном сервере Quad Core … Как я могу это оптимизировать?

$slides=get_posts( array('post_type' => 'any', 'numberposts' => 5, 'orderby' => 'date', 'order' => 'desc', "tax_query" => array( "relation" => "OR", array( "field" => "id", "terms" => array(36), "taxonomy" => "category", "operator" => "IN" ), array( "field" => "id", "terms" => array(36), "taxonomy" => "music-categories", "operator" => "IN" ), array( "field" => "id", "terms" => array(36), "taxonomy" => "video-categories", "operator" => "IN" ), array( "field" => "id", "terms" => array(36), "taxonomy" => "mixtape-categories", "operator" => "IN" ) ) ) ); 

Solutions Collecting From Web of "Очень медленный запрос"

Чтобы проверить, медленный ли запрос или что-то еще замедляет его, попробуйте запустить ваш запрос непосредственно в базе данных и посмотрите, сколько времени он занимает там.

 <?php echo $GLOBALS['wp_query']->request; ?> 

Это показывает вам последний запрос, который WordPress запускал в вашей базе данных.

Если запрос действительно медленный в базе данных, попробуйте кэшировать результаты, запуская этот конкретный запрос только один раз в час или около того. Обычно я делаю это с меню, но он работает с чем угодно. Использование переходных процессов для сохранения выходного HTML.

Я написал об этом методе здесь .

Если вам нужен другой вывод для разных таксономий, попробуйте добавить TermID в имя переходного процесса.

Вы можете удалить переходные процессы либо на «update_post», либо на их истечение через определенное время.

  1. Используйте явные типы сообщений, т. 'post_type' => array('post','music'...) . Прямо сейчас ваши запросы проверяют изменения и вложения, а также, вероятно, половина сообщения в вашей БД.

  2. Из вашего кода кажется, что вы должны заранее знать, какая таксономия имеет отношение к вашему запросу (маловероятно, что термин номер 36 имеет соответствующее значение во всех четырех таксономиях). Вы должны запрашивать только соответствующие таксономии.

  3. Если вам просто нужны 5 последних опубликованных сообщений, то, возможно, вам стоит рассчитать их на лету, когда будут добавлены новые сообщения, избегая использования запроса.

     add_action('publich_post','my77483_change_cache'); function my77483_change_cache($post_id,$post) { if (not meeting criteria) return; $chached = get_option('my77483_query_cache'); if (count($cached) == 5) array_shift($cached); // remove the oldest post. $cached[] = $post_id; update_option('my77483_query_cache',$cached); } 

Таким образом, ваш запрос будет

 $chached = get_option('my77483_query_cache'); $posts = get_posts('post__in' => $cached); 

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