Перейти к публикации

Рекомендованные сообщения

Заказал в dlemods.ru модуль, выкладываю в паблик.

1. В файле index.php:

строку:

$tpl->copy_template = preg_replace( "#\\{custom category=['\"](.+?)['\"] template=['\"](.+?)['\"] aviable=['\"](.+?)['\"] from=['\"](.+?)['\"] limit=['\"](.+?)['\"] cache=['\"](.+?)['\"]\\}#ies", "custom_print('\\1', '\\2', '\\3', '\\4', '\\5', '\\6', '{$do}')", $tpl->copy_template );


заменить на:

$tpl->copy_template = preg_replace( "#\\{custom category=['\"](.+?)['\"] template=['\"](.+?)['\"] aviable=['\"](.+?)['\"] from=['\"](.+?)['\"] limit=['\"](.+?)['\"] cache=['\"](.+?)['\"] random=['\"](.+?)['\"]\\}#ies", "custom_print('\\1', '\\2', '\\3', '\\4', '\\5', '\\6', '\\7', '{$do}')", $tpl->copy_template );


2. В файле engine/modules/functions.php:

1)

строку:

function custom_print ($custom_category, $custom_template, $aviable, $custom_from, $custom_limit, $custom_cache, $do)


заменить на:

function custom_print ($custom_category, $custom_template, $aviable, $custom_from, $custom_limit, $custom_cache, $custom_random, $do)


2)

строку:

$sql_select = "SELECT id, autor, date, short_story, full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, flag, editdate, editor, reason, view_edit, tags FROM " . PREFIX . "_post WHERE ".$stop_list.$where_category." AND approve".$where_date." ORDER BY ".$config['news_sort']." ".$config['news_msort']." LIMIT ".$custom_from.",".$custom_limit;


заменить на:

	if($custom_random == "no")

		$order_by = " ORDER BY ".$config['news_sort']." ".$config['news_msort'];

	else

		$order_by = " ORDER BY RAND()";


	$sql_select = "SELECT id, autor, date, short_story, full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, flag, editdate, editor, reason, view_edit, tags FROM " . PREFIX . "_post WHERE ".$stop_list.$where_category." AND approve".$where_date.$order_by." LIMIT ".$custom_from.",".$custom_limit;
Теперь в шаблонах, обязательно во всех тегах custom добавляем random="no", а в тех, где поставили random="yes", нужно отключить кеширование cache="no". ps Я использовал данный модуль на своём сайте для баннерной ротации новостей
{custom category="48" template="rand" aviable="global" from="0" limit="1" cache="no" random="yes"}
где rand.tpl
<a href="{full-link}"><img src="[xfvalue_random-img]" alt="{title}" /></a>

где [xfvalue_random-img] - это адрес картинки, вставляемый в новости через дополнительное поле

Ссылка на сообщение
Поделиться на других сайтах

blagoy_vip, при большом количестве новостей и хорошей посещаемости сайт положит, потому что RAND() вещь тяжёлая)

Отлично, будем знать куда не стоит обращатся за написанием модов)

Ссылка на сообщение
Поделиться на других сайтах

Это rand() MySQL'я, а он тяжестью не страдает =)

еще как страдает, в запросе используется сортировка, например выборка 5 значений и каждый раз эта функция перемешивает случайно всю БД, потом берет одно первое значение, потом опять перемешивает, берет второе и т.д. Это очень сложная в выполнении функция и на больших таблицах просто не применима, либо нужно иметь соответствующие ресурсы сервера.

По крайней мере так было в MySQL4 может в пятой версии они что и оптимизировали в данном вопросе

Ссылка на сообщение
Поделиться на других сайтах

А если так?

SELECT id, col1, col2, ... , colN FROM tab WHERE id IN (SELECT id FROM tab WHERE conditions ORDER BY RAND() LIMIT m)

===========================================================

Posted by Ravenous Bugblatter Beast on August 15 2006

If you are selecting a wide result set and using ORDER BY RAND() with a LIMIT, you can often speed things up by changing a query of the form:

SELECT id, col1, col2, ... , colN FROM tab WHERE conditions ORDER BY RAND() LIMIT m

To a query of the form:

SELECT id, col1, col2, ... , colN FROM tab WHERE id IN (SELECT id FROM tab WHERE conditions ORDER BY RAND() LIMIT m)

Although the second query has to perform an additional select, it only has to sort a result set containing the single id column, rather than the full result set you are returning from the query.

===========================================================

it's true, but if we have a big database with 1000ths of table rows and we must to join them ...... so oooops ;)

Lately I saw the following link http://jan.kneschke.de/projects/mysql/order-by-rand/ .....you can read here how to get more speed from your executing query in some cases. First read the explanation and see bottom of the page:

============================================================

Performance

Now let's see what happends to our performance. We have 3 different queries for solving our problems.

* Q1. ORDER BY RAND()

* Q2. RAND() * MAX(ID)

* Q3. RAND() * MAX(ID) + ORDER BY ID

Q1 is expected to cost N * log2(N), Q2 and Q3 are nearly constant.

The get real values we filled the table with N rows ( one thousand to one million) and executed each query 1000 times.

----------------------------------------------------------

Rows ||100 ||1.000 ||10.000 ||100.000 ||1.000.000

----------------------------------------------------------

Q1||0:00.718s||0:02.092s||0:18.684s||2:59.081s||58:20.000s

Q2||0:00.519s||0:00.607s||0:00.614s||0:00.628s||0:00.637s

Q3||0:00.570s||0:00.607s||0:00.614s|0:00.628s ||0:00.637s

----------------------------------------------------------

As you can see the plain ORDER BY RAND() is already behind the optimized query at only 100 rows in the table.

============================================================

Да уж...

Ссылка на сообщение
Поделиться на других сайтах

IT-Security,

да я тоже слегка пробежался по форумам с этой темой, плюс документации мускула - последняя не советует, на форумах в большинстве своём тоже.

SELECT id, col1, col2, ... , colN FROM tab WHERE id IN (SELECT id FROM tab WHERE conditions ORDER BY RAND() LIMIT m)

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

Ссылка на сообщение
Поделиться на других сайтах
  • 2 года спустя...

Скажите пожалуйста, данный хак у кого-нибудь работает на 9,3? Делаю все по инструкции, но независимо от того, прописанно ли random random="yes" или random="no" ВСЕ новости на сайте, что выводятся через custom, выводятся рэндомно.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...