Выбор из базы рандомом

goacher

Новичок
Выбор из базы рандомом

Есть база данных, делаю к ней запрос к ней для вывода.
Можно ли чтобы постоянно делалась рандомная сортировка при выборке???
 

mity

Новичок
И сколько по максиму строк из базы выбирается?
Может проще делать рандомизацию в php?
 

tz-lom

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

Вурдалак

Продвинутый новичок
tz-lom
От количества выбираемых данных мало что зависит. Важно сколько данных в таблице.
 

tz-lom

Продвинутый новичок
Автор оригинала: Вурдалак
tz-lom
От количества выбираемых данных мало что зависит. Важно сколько данных в таблице.
если выборка идет без LIMIT и WHERE,а база большая то будет медленно
с другой стороны если стоит какой нибудь WHERE id=3 OR id=4 то сколько бы ни было данных в базе,вызовется не более чем 1 RAND()
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
на where тут будет пофик, все равно будет фуллскан таблицы =р
 

tz-lom

Продвинутый новичок
Автор оригинала: c0dex
на where тут будет пофик, все равно будет фуллскан таблицы =р
сомневаюсь,сейчас прогнал тест на таблице из 85 записей :eek:
PHP:
mysql> SELECT BENCHMARK(10000,(SELECT COUNT(*) FROM `jos_content` ORDER BY RAND()));
+-----------------------------------------------------------------------+
| BENCHMARK(10000,(SELECT COUNT(*) FROM `jos_content` ORDER BY RAND())) |
+-----------------------------------------------------------------------+
|                                                                     0 |
+-----------------------------------------------------------------------+
1 row in set (0.30 sec)

mysql> SELECT BENCHMARK(10000,(SELECT COUNT(*) FROM `jos_content` WHERE id=44 OR id=45 ORDER BY RAND()));
+--------------------------------------------------------------------------------------------+
| BENCHMARK(10000,(SELECT COUNT(*) FROM `jos_content` WHERE id=44 OR id=45 ORDER BY RAND())) |
+--------------------------------------------------------------------------------------------+
|                                                                                          0 |
+--------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
 

SiMM

Новичок
А смысл тестить на таблице с 85 записями? Да и для COUNT'а ORDER BY может вообще не выполняться за бессмысленностью.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
tz-lom
да ты не сомневайся, прими как должное)

Код:
mysql> explain select * from reference_cities ORDER BY RAND() LIMIT 20;
+----+-------------+------------------+------+---------------+------+---------+------+-------+---------------------------------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref  | rows  | Extra                           |
+----+-------------+------------------+------+---------------+------+---------+------+-------+---------------------------------+
|  1 | SIMPLE      | reference_cities | ALL  | NULL          | NULL | NULL    | NULL | 11372 | Using temporary; Using filesort |
+----+-------------+------------------+------+---------------+------+---------+------+-------+---------------------------------+
1 row in set (0.00 sec)

mysql> explain select * from reference_cities WHERE country_id=3159 OR country_id=2617 ORDER BY RAND() LIMIT 20;
+----+-------------+------------------+-------+---------------+------------+---------+------+------+----------------------------------------------+
| id | select_type | table            | type  | possible_keys | key        | key_len | ref  | rows | Extra                                        |
+----+-------------+------------------+-------+---------------+------------+---------+------+------+----------------------------------------------+
|  1 | SIMPLE      | reference_cities | range | country_id    | country_id | 4       | NULL | 4094 | Using where; Using temporary; Using filesort |
+----+-------------+------------------+-------+---------------+------------+---------+------+------+----------------------------------------------+
1 row in set (0.00 sec)

mysql> explain select * from reference_cities WHERE country_id=3159 OR country_id=2617 ORDER BY RAND();
+----+-------------+------------------+------+---------------+------+---------+------+-------+----------------------------------------------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref  | rows  | Extra                                        |
+----+-------------+------------------+------+---------------+------+---------+------+-------+----------------------------------------------+
|  1 | SIMPLE      | reference_cities | ALL  | country_id    | NULL | NULL    | NULL | 11372 | Using where; Using temporary; Using filesort |
+----+-------------+------------------+------+---------------+------+---------+------+-------+----------------------------------------------+
1 row in set (0.00 sec)
 

iceman

говнокодер
goacher
30000 записей инфорации, и ты считаешь это нормально выводить ее в случайном порядке? кому такая нахер инфа нужна будет? толку от нее 0
 

dimagolov

Новичок
генери случайные id в нужном кол-ве (если могут быть дырки, то сделай с запасом) и отбирай именно эти id.
 

Духовность™

Продвинутый новичок
а мнетпо моему даже тут годика полтора советовали такой метод:
[sql] SELECT SQL_NO_CACHE *
FROM article
WHERE article.id >= (
SELECT FLOOR( MAX( article.id ) * RAND( ) )
FROM article )
ORDER BY ROUND( RAND( ) )
LIMIT 0 , 4 [/sql]
 

zerkms

TDD infected
Команда форума
triumvirat
какой ад. сделайте меня развидеть это.
 

Духовность™

Продвинутый новичок
zerkms
ну да.

а все-таки, как рандомно записи получать? сдается мне, вариант dimagolovа наиболее легким. Но если частые пропуски будут в базе, в PK, тогда как?
 

Вурдалак

Продвинутый новичок
Имеется в виду на PHP их генерировать.

Либо ещё вариант с полем для номера записи, но тогда придётся позаботиться о том, чтобы этих самых «дыр» не было. Получится всего два запроса и выборка уже должна быть по индексу.
 
Сверху