Случайный выбор 10 строк в mysql

Как я могу получить 10 строк случайным образом из таблицы с не менее чем 1 миллионом регистров? Я читал о порядке с помощью random(), но многие говорят, что это так медленно. какой алгоритм я могу использовать в этом случае?


person Zesschrno    schedule 20.02.2015    source источник


Ответы (1)


Это правда, что ORDER BY RAND() LIMIT n отнимает много времени. Но это дает довольно хороший псевдослучайный выбор n различных строк.

Вместо этого вы можете попробовать это. Ему все равно придется сканировать вашу таблицу, но сортировать ее не придется. Это не гарантирует ровно десять строк; он может дать больше или меньше.

SELECT *
  FROM (
          SELECT a.*
            FROM mytable a
            JOIN (select COUNT(*) rowcnt, 10 samplecnt from mytable) c
           WHERE RAND() <= (CAST(samplecnt AS DOUBLE) )/ CAST(rowcnt AS DOUBLE)
       ) sample
 ORDER BY rand()

Он работает, используя псевдослучайное число, чтобы выбрать, включать ли каждую строку вашей таблицы в набор результатов.

В моей тестовой таблице с 750 тыс. строк подход ORDER BY RAND() LIMIT 10 был в три раза медленнее, чем подход WHERE RAND() <=....

person O. Jones    schedule 20.02.2015
comment
Надеюсь, вы не против, что я добавил вашу методику 8-й в свой блог (выше). В процессе я удвоил скорость, заменив COUNT(*) выборкой TABLE_ROWS из information_schema. mysql.rjweb.org/doc.php/ - person Rick James; 21.02.2015