Как я могу получить 10 строк случайным образом из таблицы с не менее чем 1 миллионом регистров? Я читал о порядке с помощью random(), но многие говорят, что это так медленно. какой алгоритм я могу использовать в этом случае?
Случайный выбор 10 строк в mysql
Ответы (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
Надеюсь, вы не против, что я добавил вашу методику 8-й в свой блог (выше). В процессе я удвоил скорость, заменив
COUNT(*)
выборкой TABLE_ROWS
из information_schema
. mysql.rjweb.org/doc.php/
- person Rick James; 21.02.2015