Altynayka
Вообще, задача "выбрать случайные N строк из таблицы" - несмотря на простую формулировку, не имеет простого решения.
По поводу Вашего решения - на недостатки я указывал - ведь Вы загружаете в память весь набор идентификаторов, и потому работа замедляется.
Существует несколько подходов к решению задачи, но нет "идеального". Среди решений я бы выделил два основных направления:
- Использующие только SQL. К таким относятся ORDER BY RAND() и все подобное. Впрочем, удалось найти и более оригинальные решения,
например
CODE (
SQL):
скопировать код в буфер обмена
SELECT pk, DATA
FROM test AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(pk)
FROM test)) AS id)
AS r2
WHERE r1.pk >= r2.id
ORDER BY r1.pk ASC
LIMIT 1;
этот вариант будет существенно быстрее, однако же он дает возможность выбрать лишь одну запись, и таким образом, в случае N записей сложность возрастает линейно.
- Варианты, использующие различные внешние средства. Например, php-генерация запроса.
- использовать UNION и LIMIT. Подойдет только для небольших таблиц, так как LIMIT M,1 заставляет СУБД выбирать M строк с тем, чтобы потом оставить одну, то есть производительность ухудшается линейно с увеличением размера таблицы: