Один из способов, которым я нахожу очень хорошо, если есть автогенерированный идентификатор, заключается в использовании оператора modulo «%». Например, если вам нужно 10 000 случайных записей из 70 000, вы можете упростить это, сказав, что вам нужно 1 из каждых 7 строк. Это может быть упрощено в этом запросе:
SELECT * FROM
table
WHERE
id %
FLOOR(
(SELECT count(1) FROM table)
/ 10000
) = 0;
Если результат деления целевых строк на общий доступ не является целым числом, у вас будут дополнительные строки, кроме того, что вы просили, поэтому вы должны добавить LIMIT, чтобы помочь вам обрезать набор результатов следующим образом:
SELECT * FROM
table
WHERE
id %
FLOOR(
(SELECT count(1) FROM table)
/ 10000
) = 0
LIMIT 10000;
Это требует полного сканирования, но оно быстрее, чем ORDER BY RAND, и, на мой взгляд, проще понять, чем другие варианты, упомянутые в этот поток. Кроме того, если система, которая записывает в БД, создает множество рядов в партиях, вы не можете получить такой случайный результат, как ожидаете.