Неэффективный SQL - PullRequest
       20

Неэффективный SQL

2 голосов
/ 04 мая 2011

Я не эксперт по MySQL, но до сих пор мне удавалось собрать воедино то, что работает.К сожалению, моя последняя попытка в бодрствующем состоянии приводит к смерти сервера, поэтому, очевидно, я делаю что-то, что в целом неэффективно.Может кто-нибудь дать мне подсказку о том, где проблема и как я могу получить те же результаты, не останавливая весь сайт каждый раз?

$sqlbest = "SELECT  
        wp_postmeta.meta_value 
      , wp_posts.post_title 
      , wp_posts.ID
      , (TO_DAYS(CURDATE())- TO_DAYS(wp_posts.post_date))+1 AS days 
    FROM  `wp_postmeta` ,  `wp_posts` 
WHERE  `wp_postmeta`.`post_id` =  `wp_posts`.`ID` 
  AND  `wp_posts`.`post_date` >= DATE_SUB( CURDATE( ) , INTERVAL 1 WEEK) 
  AND  `wp_postmeta`.`meta_key` =  'views' 
  AND  `wp_posts`.`post_status` =  'publish' 
  AND wp_posts.ID != '".$currentPostID."'
GROUP BY  `wp_postmeta`.`post_id` 
ORDER BY (CAST(  `wp_postmeta`.`meta_value` AS UNSIGNED ) / days) DESC 
LIMIT 0 , 4";

$results = $wpdb->get_results($sqlbest);

Он использует количество просмотров постов для расчета просмотров / день для постовопубликованный в последнем, затем упорядочивает их по этому количеству и берет верхние 4.

Я думаю, что я вижу, что это неэффективно, так как он должен рассчитывать эти просмотры / день каждый раз для нескольких тысяч сообщений, но яне знаю, как сделать это лучше

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 мая 2011
SELECT  
  wp_postmeta.meta_value 
  , wp_posts.post_title 
  , wp_posts.ID
  , DATEDIFF(CURDATE(),wp_posts.post_date)+1 AS days <<--1: DATEDIFF
FROM  wp_postmeta
INNER JOIN wp_posts ON (wp_postmeta.post_id =  wp_posts.ID) <<--2: explicit join
WHERE wp_posts.post_date >= DATE_SUB( CURDATE( ) , INTERVAL 1 WEEK) 
  AND wp_postmeta.meta_key = 'views' 
  AND wp_posts.post_status = 'publish' 
  AND wp_posts.ID != '".$currentPostID."'
  AND wp_postmeta.meta_value > 1   <<-- 3: extra filter
/*GROUP BY wp_postmeta.post_id */  <<-- 4: group by not needed
ORDER BY (CAST( wp_postmeta.meta_value AS UNSIGNED ) / days) DESC 
LIMIT 0 , 4;

Я попытался внести несколько изменений.

  1. Заменили два вызова на TO_DAYS одним вызовом на DATEDIFF.
  2. Заменен уродливым неявным, когда объединение с явным inner join ничего не делает, просто проясняет ситуацию. Это показывает одну вещь: , если wp_postmeta.post_id уникален, тогда вам не нужна группа, поскольку внутреннее объединение даст только одну строку на wp_postmeta.post_id.
  3. Добавлен дополнительный фильтр для фильтрации постов с небольшим количеством просмотров, это ограничивает количество строк, которые MySQL должен сортировать.
  4. Исключено group by Это верно только в том случае, если wp_postmeta.post_id уникально!
0 голосов
/ 04 мая 2011

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

...