Лучшее решение — брать рандом в диапазоне, в котором лежит первичный ключ — и доставать запись, ключ которой больше или равен этому рандому. Типа такого:
SELECT * FROM my_table
WHERE pk_column >=
(SELECT FLOOR( MAX(pk_column) * RAND()) FROM my_table)
ORDER BY pk_column
LIMIT 1;
Конечно, возникают проблемы в таблицах, где удалены большие диапазоны запесей, но для этого есть тоже свои решения, вроде введения дополнительного сквозного поля без «дырок». Вот можно почитать подробнее
тут