Оптимизировать mysql запрос php

Discussion in 'PHP' started by serg-php, 24 Aug 2011.

  1. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Есть такой блок, который выводит рандомно релевантные статьи из категории.
    Данные кэшируются, но при рандомной выборке (rand() AS rnd)
    при выводе статьи блок релевантных статей постонянно меняется.

    1. Хотелось бы сделать так, чтобы при обновлении страницы новый рандомный
    запрос выполнялся через некоторый интервал.

    2. Где-то читал, что конструкция (rand() AS rnd) в запросе к мускулу не производительна
    и может быть причиной slow queries. Ее можно как-то оптимизировать, усовершенствовать?

    PHP:
    function Random_Related_Articles(&$tpl){
      
      global 
    $db,$a_Ad,$TITLE_FIELD;
       
    /*
      $ql = 'SELECT link_id AS o_id,'.$TITLE_FIELD.' AS o_title, images AS o_images, b_descr AS o_descr, rand() AS rnd FROM '.TBL_AD.
            ' WHERE catid="'.$a_Ad['catid'].'"'.
          FilterGetSQL().' GROUP BY '.$TITLE_FIELD.' ORDER BY rnd LIMIT 3';
      */

    ################ REGION CRITERION ###########

    $reg_id REGION_CRITERION;

    #############################################

    #AND _region_id IN (".get_daughter_cats($reg_id, ModTable('Regions','category'))

     
    $ql 'SELECT link_id AS o_id,'.$TITLE_FIELD.' AS o_title, images AS o_images, b_descr AS o_descr, rand() AS rnd FROM '.TBL_AD.
             
    ' WHERE catid="'.$a_Ad['catid'].'"AND _region_id IN ('.get_daughter_cats($reg_idModTable('Regions','category')).')
           '
    .FilterGetSQL().' GROUP BY link_id ORDER BY rnd LIMIT 4';


     
    $res $db->query($ql);
     
      while(
    $v mysql_fetch_assoc($res)){
        
      if(
    $v['o_images']) list($v['o_images']) = explode("\n",$v['o_images']);
          
     
    $title_url SearchFriendlyURL($v['o_title']);
     
     
    $v['o_ad_url'] = $title_url.'-o'.$v['o_id'].'.html';
       
    #var_dump ($v['o_ad_url']);

    $v['o_descr'] = strip_tags($v['o_descr']);  
      
    $v['o_descr'] = Cut_Text_by_words($v['o_descr'], 100);
    $v['o_alt'] = Cut_Text_by_words($v['o_title'], 25);
      
        
    $tpl->AddCell('b_Random_Related_Articles',$v);
      }

    }
     
  2. gibson

    gibson Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    оптимизировать нужно, тогда когда приложение нуждается в отпимизации, в противном случае разница будет не велика

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

    ставьте четче задачу.
     
  3. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    Кешируй 10 разных вариантов, а затем выполняй их ротацию.
     
  4. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    А не лучше ли


    Считать все ID из таблицы, потом через PHP выбирайте рандомом из этого массива 1 значения и делайте уже запрос с точным ID и LIMIT 1
     
  5. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    Это будет еще хуже чем есть сейчас.

    Я предложил вообще убрать запрос :) Случайные элементы будут запрошены из базы только тогда, когда истечет время жизни кеша, все остальное время этот самый блок со случайными элементами будет браться из файла/memcached/другого движка кеширования.
     
  6. in1ernal

    in1ernal New Member

    Joined:
    23 Aug 2011
    Messages:
    5
    Likes Received:
    1
    Reputations:
    -5
    Я бы сделал привязку ко времени.

    Допустим в период от 0 до 10 минут ты один раз делаешь кэширование и выводишь один и тот же блок все эти 10 минут.

    То же самое с 10 по 20 минуту часа, и т.д. и т.п.
     
  7. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Так все так и работало ранее до включения рандомной выборки.

    Моя проблема - задать алгоритм, на основании которого будет произвольно браться 4 - id для каждой новости отдельно.
     
  8. in1ernal

    in1ernal New Member

    Joined:
    23 Aug 2011
    Messages:
    5
    Likes Received:
    1
    Reputations:
    -5
    rand(x, y)

    y - максимальный ID. Его кстати тоже можно где-нибудь закэшировать =D
     
Loading...
Similar Threads - Оптимизировать mysql запрос
  1. GAiN
    Replies:
    3
    Views:
    7,393