так это классическая задача

ORDER BY RAND() - при большом кол-ве данных это пиздец, да. На мелких пох.
Основная идея такая: нет ничего быстрее чем SELECT id FROM tbl
WHERE id=100500, при условии, что
id уник кей
если нужно несколько записей, то: ....WHERE id IN (100500, 500100, 1, 5, 100, 500)
Придумываем такой алгоритм:
- вводится уникальный числовой индекс, лучше primary key
- генерируется случайное число в
диапазоне этого индекса и делает WHERE id=$randnum или WHERE id IN ()
генерация рандома может быть как на стороне сервера(mysql), так и на стороне клиента (php). Вариант с сервером более правильный.
Но будут проблемы: при частом обновлении таблицы возникнут проблемы из-за дыр в индексе. Их можно обойти разными способами:
можно заранее пытаться выбрать записей больше чем нужно, и если каких-то сгенерированных индексов не будет - то ничего страшно, раз все равно выбираем с запасом
можно выбирать впритык, и если не хватило, то добирать(делать sql запрос повторно, что не очень). Такой вариант у меня шпарит 120к/с на 100кк записей, но у меня прореженность индекса почти нулевая.
есть еще вариант с LIMIT 1, описанный
dveredel - там фишка в том, что не надо точно подбирать id, но и расход памяти больше. Меня он не устроил в свое время, в том числе из-за невозможности использовать хеш-индексы. А они быстрее обычных b-tree
Вот тут еще толково описано:
http://sqlinfo.ru/forum/viewtopic.php?pid=11355#p11355