Есть такой блок, который выводит рандомно релевантные статьи из категории. Данные кэшируются, но при рандомной выборке (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_id, ModTable('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); } }
оптимизировать нужно, тогда когда приложение нуждается в отпимизации, в противном случае разница будет не велика в любом случае приведенный кусок ни о чем не скажет, т.к. много других подводных камней. ставьте четче задачу.
А не лучше ли Считать все ID из таблицы, потом через PHP выбирайте рандомом из этого массива 1 значения и делайте уже запрос с точным ID и LIMIT 1
Это будет еще хуже чем есть сейчас. Я предложил вообще убрать запрос Случайные элементы будут запрошены из базы только тогда, когда истечет время жизни кеша, все остальное время этот самый блок со случайными элементами будет браться из файла/memcached/другого движка кеширования.
Я бы сделал привязку ко времени. Допустим в период от 0 до 10 минут ты один раз делаешь кэширование и выводишь один и тот же блок все эти 10 минут. То же самое с 10 по 20 минуту часа, и т.д. и т.п.
Так все так и работало ранее до включения рандомной выборки. Моя проблема - задать алгоритм, на основании которого будет произвольно браться 4 - id для каждой новости отдельно.