саймый быстрый способ выбрать случайные записи это просто использовать поле которое содержит случайные числа в диапазоне меньшем чем кол-во записей в таблице, естественно поле индексированное.
для того чтоб выбрать несколько случайных строк необходимо сгенерировать случайное число один раз (в скрипте например ) и выбрать все записи содержащие это число. только единственная проблемма может встать в том что в таблице может быть менее 3х записей тогда остальные надо выуживать другими запросами. как мне кажется то и ORDER BY RAND() во множестве уже выбранных записей будет выполняться быстрее чем на множестве не выбранных по такому числу (хотя надо проверить)
Код:
select * from table1 where rnd=$rnd
, где rnd это поле содержащие случаные числа, а $rnd переменная сгенерированным в скрипте значением. значение как и rnd, так и $rnd необходимо выбирать меньшее чем количество записи по той простой причине, что мы должны с вероятностью стремящейся к единице получить хоть какие-то записи.
а для того чтоб создать новое поле надо просто добавить alter table'ом его и создать на нем индекс затем, можно даже каждый день пересчитывать эти случайные величины по крону:
Код:
update table1 set rnd=rand()*$max_rnd
Добавлено через 8 минут
Решение проблемы случайной выборки из большого количества записей, почему может перестать выполняться такой запрос и решение проблемы можно прочитать
Для просмотра ссылки Войди или Зарегистрируйся
да хотя можно было и не городить огород с полем содержащем случайное значение, а использовать эту реализацию... но для того чтоб не получать подряд идущие записи, надо просто в скрипте в цикле вызывать процедуру генерения лимита (например для 3х записей вызвать три раза селект с "limit ".rand(0,$totals-1).",1"), это вполне быстрая операци (у меня на 700 тыс записей 0.2 сек работает такой вызов)