Общие > Базы данных

Случайная картинка

<< < (3/4) > >>

html_coder:

--- Цитировать ---Egorsha:
Может закрыть эту тему? а?
--- Конец цитаты ---


Нет, от чего же закрыть, тему надо развить...

Значит ещё раз смотрим внимательно мой пример.

1) Где в моем коде я перекладываю всё полученное из базы в массив?
2)
--- Цитировать ---Egorsha:
и наконец получение N первых записей из таблицы (но не одной случайной)
--- Конец цитаты ---


А это где?

Смотрим сюда Что какое LIMIT n,m

Проще говоря запрос выбирает одну запись со смещения $random_image,  которое как вы правильно поняли будет в интервале от 0 до количества изображений, т.е. гаранитировано я выберу одну запись и 100% случайную... Где привязка к ID? В данном случае абсолютно всё равно какие ID есть в базе а каких нет?

По поводу быстродействия утверждать не буду надо проверять, но практически уверен, что на огрмной таблице ORDER BY RAND() будет работать медленнее (сталкивался с ним), при чем гораздо!

Egorsha:
Все сдаюсь ;)


--- Цитировать ---html_coder:
...ещё раз смотрим внимательно мой пример...
--- Конец цитаты ---


И это правильно - не доглядел ;)

mysql_query(\'SELECT * FROM images LIMIT \'.$random_image.\',1);

Увидел это, и воспринял "неправильно", типа так:


mysql_query(\'SELECT * FROM images LIMIT \'.$random_image,1);


отсюда "LIMIT n", "первые n" и т.д.
(Только давай этот второй параметр "1" не будем развивать в продолжение темы ;) Он меня слегка смутил, но так как давно уже написан класс работы с базой и я "явно" этой функцией так же давно не пользуюсь (и вряд ли "явно" воспользуюсь)).

А вот если бы я "правильно" увидел:

mysql_query(\'SELECT * FROM images LIMIT \'.$random_image.\',1\');


То сразу бы заметил LIMIT n,m :) (Ну, а что делать, я тоже могу ошибаться. Вон нет "кавычки" и все ОК. :))

И вот уже интересно, чес слово, все это проверить, что быстрее.
Из всех таблиц, что  есть в распоряжении одна с 7200 записями. Потянет за "огромную"? (Другой просто нет).
Или "чистота эксперимента" не будет соблюдена?

Тему надеюсь не закроют до окончания "эксперимента"? :)

Yukko:

--- Цитировать ---А вдруг у других БД в документации по иному прописано.
--- Конец цитаты ---

Насколько я понимаю, принцип работы других РСУБД будет таким же ;) Берется таблица, делается полная выборка (если нет лимит), а после этого из общей массы выбирается что-то случайное.

Я в код MySQL не смотрел, пусть меня поправят те, кто смотрел, но про механизм образования этого "случайного" я могу догадаться проведя эксперимент:
select * from table order by 1
select * from table order by 2
select * from table order by 3
select * from table order by n
где n — количество полей в таблице.
Если ORDER BY RAND() случайно где-то сортирует таблицу по одному из случайно выбранных полей, а потом берет случайную запись из получившегося результата, то можно себе представить, что будет, если сортировка будет проводиться на таблице с миллионом записей и по полю, по которому нет индекса.

Делать ORDER BY RAND() на больших таблицах без LIMIT, детально не разобравшись, сколько рядков будет просмотрено, чтобы вернулся  запрошенный результат, по которому будет делаться ORDER BY RAND(), я бы не стал ;) склеит ласты, потом не расклеишь. Судя по всему, в мануале не зря написан пример:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c ORDER BY RAND() LIMIT 1000;
http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html


--- Цитировать ---Egorsha:
Все просто - приведенный Вами код делает не то, о чем спрашивали.
--- Конец цитаты ---

а если попробовать разобраться с LIMIT?

tigranav:
Из дискуссии я понял что лучше использовать пример html_coder-а
mysql_query(\'SELECT * FROM images LIMIT \'.$random_image.\',1\');

Egorsha:

--- Цитировать ---Yukko:
а если попробовать разобраться с LIMIT?
--- Конец цитаты ---


Выше написал -  не правильно трактовал отсутствующую "кавычку" в коде html_coder-а. Отсюда и LIMIT n вместо LIMIT n,m и все остальное вытекающее... и т.д. и т.п.

Уважаемый html_coder, если я, пребывая в невольном заблуждении, все же умудрился чем-то оскорбить Вас (а цели такой не преследовал, мотивации описал выше), то просьба извинить меня.

Теперь проведенный "эксперимент".
Код (отрицательные значения лечатся F5 - не стал обрабатывать различные секунды):

$table="...";
$tm1=gettimeofday();
$result = mysql_query(\'SELECT COUNT(*) as images_count FROM \'.$table);
$images_count = mysql_result($result, 0, 0);
$random_image = rand(0, $images_count);
mysql_query(\'SELECT * FROM \'.$table.\' LIMIT \'.$random_image.\',1\');
$tm2=gettimeofday();
$tmp1=$tm2[\'usec\']-$tm1[\'usec\'];
$tm1=gettimeofday();
mysql_query(\'SELECT * FROM \'.$table.\' ORDER BY RAND() LIMIT 1\');
$tm2=gettimeofday();
$tmp2=$tm2[\'usec\']-$tm1[\'usec\'];
echo "Записей: ".$images_count."
";
echo "Время работы: ".$tmp1." - микросекунд
";
echo "Время работы: ".$tmp2." - микросекунд
";
echo "K =".($tmp2/$tmp1)."
";


Результаты: (можете сами проверить кому интересно)

При использовании ORDER BY RAND() работает в общем медленнее.
- На меленьких таблицах разница есть, но маленькая - десятки-сотни микросекунд.
- На таблице побольше уже ощутимее:

По минимуму где-то так:

Время работы: 21540 - микросекунд
Время работы: 129674 - микросекунд
Записей: 7811
K =6.02014856082

По максимуму может вылезти и намного выше. (Выпадало и К=130.)

- Если записи по объему большие (например, картинка лежит в поле таблицы), то время работы запроса увеличивается и в одном и втором случае, а коэффициент K в принципе не меняется.
 

--- Цитировать --- tigranav:
Из дискуссии я понял что лучше использовать пример html_coder-а
--- Конец цитаты ---


Если большая база и критично время - то именно так.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии