Самый быстрый способ получить случайную запись из БД - PullRequest
1 голос
/ 02 сентября 2010

Я использовал order by rand (), и это становится слишком большим количеством бутылочного горлышка.

Я пробовал это

SELECT id
FROM users
JOIN (
  SELECT CEIL( RAND( ) * ( SELECT MAX( id ) FROM users ) ) AS id
) AS r2
  USING ( id )

И это сработало бы, если бы все идентификаторы были увеличены, однако с этой конкретной таблицей это не так. Идентификаторы сами по себе довольно случайны.

У кого-нибудь есть лучший метод? Спасибо!

Ответы [ 5 ]

1 голос
/ 17 марта 2011

Раверен: должно быть быстрее ...

$ids = mysql::getSingleColumn('query');

$limit = 3;
shuffle($ids);

for($i=0;$<$limit;$i++)
  $usedIds[] = $ids[$i];

$idClause = implode(',',$usedIds);
1 голос
/ 02 сентября 2010

Может быть, создать еще одну таблицу и поместить все идентификаторы в компактном виде, добавив id int autoincrement? Если вы часто используете эту функцию, новая таблица окупится.

0 голосов
/ 02 сентября 2010

Это код, который я использую в нашем приложении для решения проблем с производительностью, и он тестируется для того, чтобы работать быстрее, чем order by rand():

$ids = mysql::getSingleColumn("select id from table where simple_where_clause = 'value'");

$limit = 3;

for ($i = 0;$i<$limit;$i++) {
    $r = rand( 0, count( $ids ) );
    if (isset($ids[$r])) {
        $usedIds[] = $ids[$r];
        unset($ids[$r]);
    } else {
        $i--;
    }
}
$idClause = implode(',',$usedIds);

Затем я использую $ idClause в основном запросе:[...] WHERE id in ({$idClause})

0 голосов
/ 02 сентября 2010

хорошо, если у вас много строк, упорядочение по rand () настоятельно НЕ рекомендуется, потому что каждая строка должна иметь случайное число, вычисленное до того, как можно упорядочить набор результатов.

Может быть, посмотрите на это -> http://www.electrictoolbox.com/msyql-alternative-order-by-rand/

0 голосов
/ 02 сентября 2010

Вы можете использовать это (у него есть некоторые недостатки)

SELECT id FROM users ORDER BY RAND() LIMIT 0,1

Mysql reference

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...