Agon
20:01 05-03-2008 Order by rand()
Очень неплохая мысль по поводу оптимизации запросов SQL. Обычно, когда хотят взять одну или несколько случайных записей из таблицы, использцуют конструкцию "select * from table order by rand() limit x", которая и возвращает x случайных записей. Однако, на больших таблицах, этот запрос заметно подтормаживает. И это не удивительно, ведь чтобы выполнить подобный запрос, СУБД должен сначала раздать случайные значения каждой записи в таблице, а потом еще и отсортировать таблицу по этим значениям, и все это для выбора одной-двух строчек. Собственно, если задуматься над этим вопросом, то ответ будет очевиден: вычислять rand() должен код программы. Для этого придется сделать лишний запрос "select cout(id) from table", но этот запрос выполняется очень быстро даже на больших таблицах. А потом останется просто взять случайное число y в диапазоне от 1 до x и достать нужную запись при помощи простого запроса "select * from table limit by y, 1". Немного сложнее это будет для нескольких записей (как минимум, придется контролировать уникальность выбраных ID), но даже такая конструкция для больших таблиц будет работать быстрее, чем "order by rand()", так что мысль дельная. Worth trying.