Общие > Базы данных
Случайная картинка
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-а
--- Конец цитаты ---
Если большая база и критично время - то именно так.
Навигация
Перейти к полной версии