Obtener un registro genuinamente aleatorio puede ser lento. Realmente no hay mucho para evitar este hecho; si desea que sea realmente aleatorio, entonces la consulta debe cargar todos los datos relevantes para saber qué registros debe elegir.
Afortunadamente, sin embargo, hay formas más rápidas de hacerlo. No son correctamente aleatorios, pero si está feliz de intercambiar un poco de aleatoriedad pura por velocidad, entonces deberían ser lo suficientemente buenos para la mayoría de los propósitos.
Con eso en mente, la forma más rápida de obtener un registro "aleatorio" es agregar una columna adicional a su base de datos, que se completa con un valor aleatorio. ¿Quizás un hash MD5 salado de la clave principal? Lo que sea. Agregue los índices apropiados en esta columna y luego simplemente agregue la columna a su ORDER BY
cláusula en la consulta, y obtendrá sus registros en un orden aleatorio.
Para obtener un solo registro aleatorio, simplemente especifique LIMIT 1
y agrega un WHERE random_field > $random_value
donde el valor aleatorio sería un valor en el rango de su nuevo campo (por ejemplo, un hash MD5 de un número aleatorio).
Por supuesto, la desventaja aquí es que aunque sus registros estarán en un orden aleatorio, estarán atascados en el mismo orden aleatorio. Dije que estaba intercambiando perfección por velocidad de consulta. Puede evitar esto actualizándolos periódicamente con valores nuevos, pero supongo que eso podría ser un problema para usted si necesita mantenerlo actualizado.
El otro inconveniente es que agregar una columna adicional puede ser demasiado pedir si tiene restricciones de almacenamiento y su base de datos ya tiene un tamaño enorme, o si tiene que superar un DBA estricto antes de poder agregar columnas. Pero, de nuevo, tienes que compensar algo; si desea la velocidad de consulta, necesita esta columna adicional.
De todos modos, espero que haya ayudado.