Si bien no existe tal cosa como un "pedido rápido por rand()", existe una solución para su tarea específica.
Para obtener una única fila aleatoria , puedes hacer lo que hace este blogger alemán:http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- estudio-de-caso-de-alternativas/ (No pude ver una URL de enlace activo. Si alguien ve uno, siéntase libre de editar el enlace).
El texto está en alemán, pero el código SQL está un poco más abajo en la página y en grandes cuadros blancos, por lo que no es difícil de ver.
Básicamente, lo que hace es crear un procedimiento que hace el trabajo de obtener una fila válida. Eso genera un número aleatorio entre 0 y max_id, intente obtener una fila y, si no existe, continúe hasta que encuentre una que sí. Él permite obtener x número de filas aleatorias almacenándolas en una tabla temporal, por lo que probablemente pueda reescribir el procedimiento para que sea un poco más rápido y obtenga solo una fila.
La desventaja de esto es que si elimina MUCHAS filas y hay grandes espacios vacíos, es muy probable que se pierda muchas veces, lo que lo hace ineficaz.
Actualización:Diferentes tiempos de ejecución
Puede que tenga que ver con la indexación. id
está indexado y es de acceso rápido, mientras que agregar username
al resultado, significa que necesita leer eso de cada fila y ponerlo en la tabla de memoria. Con el *
también tiene que leer todo en la memoria, pero no necesita saltar alrededor del archivo de datos, lo que significa que no se pierde tiempo buscando.
Esto marca la diferencia solo si hay columnas de longitud variable (varchar/texto), lo que significa que tiene que verificar la longitud y luego omitir esa longitud, en lugar de simplemente omitir una longitud establecida (o 0) entre cada fila.