Оптимизация запросов - PullRequest
       2

Оптимизация запросов

0 голосов
/ 19 февраля 2011

У меня есть установка WP с более чем 50 тысячами статей.иногда сайт замедляется из-за множества заблокированных запросов.похоже, что какой-то код запускает безумные запросы, подобные этому

SELECT SQL_CALC_FOUND_ROWS  wp_posts.* 
   FROM wp_posts  
   WHERE 1=1  
   AND wp_posts.ID NOT IN (43500, ... )) 
   AND wp_posts.ID NOT IN ( SELECT tr.object_id 
                                   FROM wp_term_relationships AS tr 
                                   INNER JOIN wp_term_taxonomy AS tt
                                   ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'category' AND tt.term_id IN ('20207', '20788', '20789', '20790', '20791', '20792', '20793', '20794', '20795', '20796', '20797', '20798', '20799', '20800', '20801', '20802', '20803', '20804', '20805', '20806', '20807', '20808', '21012') ) 
                                  AND wp_posts.post_type = 'post' 
                                  AND (wp_posts.post_status = 'publish')  
   ORDER BY wp_posts.post_date DESC LIMIT 0, 5

список wp_posts ID NOT IN (...) содержит более 5000 идентификаторов , и это приводит к очень долгой работезапрос.

откуда этот запрос?как я могу улучшить это?

Ответы [ 3 ]

1 голос
/ 19 февраля 2011

Я не знаю, откуда поступил запрос, но попробуйте текстовый поиск на вашей установке wp. Поиск SQL_CALC .., вероятно, добьется цели.

IN и NOT IN являются убийцами производительности, как и в большинстве Оптимизаторы запросов - это то же самое, что список объятий OR.

Не уверен, что поддерживает mysql, но обычно NOT NOT существует лучшая производительность. Осталось присоединиться и может ГДЕ НЕ НУЛЯЕТ иногда сделать тоже самое.

1 голос
/ 19 февраля 2011

Создание индексов во внешних ключах, которые в таблицах, которые используются в JOIN, повысят производительность

0 голосов
/ 20 февраля 2011

Мне удалось оптимизировать запрос, написав свой собственный SQL-код в шаблоне.

Вот код, который я использую для выбора сообщений (исключая две категории). После запроса я обычно использую цикл

<?php
$querystr = "SELECT DISTINCT wposts.* 
FROM $wpdb->posts wposts
    LEFT JOIN $wpdb->postmeta wpostmeta ON wposts.ID = wpostmeta.post_id 
    LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE 
     $wpdb->term_taxonomy.taxonomy = 'category'
    AND NOT $wpdb->term_taxonomy.term_id IN(20207, 20788)
        AND post_status = 'publish'



ORDER BY post_date desc limit 15;

";
$pageposts = $wpdb->get_results($querystr, OBJECT);
  global $post; 
 foreach ($pageposts as $post): ?>
 <?php setup_postdata($post); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...