Как в PHP перейти к определенной записи из результата запроса, и перемешать результаты?
//Запрос вида
$res = mysql_query(SELECT * FROM users");
//нужно перемешать рандомно результат (функция shuffle() не помогает, потому что результат не массив, а ссылка на ресурс
$n = mysql_num_rows($res);
for ($i = 0; $i < $n; $i++) {
$r = mysql_fetch_array($res); //вот это уже массив, но тут шафл неуместен, потому что поменяются местом поля, а надо поменять строки
}
//и вообще, можно ли перемешать шаффлом строки двумерного массива
ORDER BY RAND() функционально идеален, но судя по отзывам, сильно грузит сервер при большой таблице. Будет ли он тормозить по мере увеличения таблицы, если добавить условие, ограничивающее количество записей до 500 максимум?
Например:
SELECT * FROM users WHERE id > 0 AND id < 500 ORDER BY RAND()
$res = mysql_query(SELECT * FROM users ORDER BY RAND()");
ORDER BY RAND() работает с уже выбранным записями, поэтому, если предварительно ограничить множество условием типа
WHERE user_id BETWEEN 1 AND 10000
записей в выборку попадёт меньше и рандомизатор отработает быстрее.
Это легко проверить, посмотрев на планы запросов:
EXPLAIN
SELECT * FROM user WHERE user_id BETWEEN 1 AND 1000 ORDER BY RAND()
; -- вес 1`500
EXPLAIN
SELECT * FROM user WHERE user_id BETWEEN 1 AND 100000 ORDER BY RAND()
; -- вес 130`000