domingo, 16 de febrero de 2014

Seleccionar un registro aleatoriamente con MySQL

Si necesitamos obtener una fila aleatoria de una tabla MySQL, es muy probable que si no conocemos sus problemas, optemos por la función RAND().


SELECT * FROM tabla ORDER BY RAND() LIMIT 1;


Éste es una de esas funciones que suenan muy bien a primera vista y donde muchos programadores suelen caer. Sin embargo se trata de una función lenta y que utiliza muchos recursos del servidor ya que MySQL tiene que generar una tabla temporal completa con todos los datos de la tabla original reordenados aleatoriamente.

Si realmente necesitas obtener un registro aleatorio hay mejores formas de hacerlo y así prevenir un cuello de botella que aumentará a medida que aumenta el número de registros de la tabla.

   $res = mysqli->query("SELECT count(*) FROM tabla");
   $fila = $res->fetch_row();
   $rand = mt_rand(0, $fila[0] – 1);
 
   $res = mysqli->query("SELECT * FROM tabla LIMIT $rand, 1");

No hay comentarios:

Publicar un comentario