Una mejor forma de seleccionar un fila al azar en MySQL

Uno podría pensar que al ejecutar un query tan simple como elegir una fila al azar de una tabla pequeña (cerca de 500 registros) no debería tener importancia, que es el query ejecutado en los botones de Blogs Chapines:

SELECT * FROM bc_blogs ORDER BY RAND() LIMIT 1;
(1 total, Query took 0.0128 sec)

Un tiempo bastante pequeño y razonable. Pero cuando este query se ejecuta 7,000 veces al día, ya empieza a tener mayor importancia. Buscando por una opción mucho que me diera un query mucho rápido, encontré en Selecting random record from MySQL database table, otra forma de seleccionar un registro al azar ejecutando:

SELECT FLOOR( RAND() * COUNT(*) ) AS `offset`FROM `bc_blogs`
(1 total, Query took 0.0005 sec)

Un query que en mi PC se ejecuta 25 veces más rápido que el que el anterior, sweet!. Luego de ejecutarlo sabemos que fila debemos obtener, ejecutando un simple:

SELECT * FROM `bc_blogs` LIMIT $offset, 1 

Que toma solo una fracción de segundo ejecutar. Muchas veces nos pasa que por comodidad no nos fijamos en el rendimiento de las cosas, es algo que estoy aprendiendo ahora que he estado reescribiendo el código detrás de Blogs Chapines.

El código original fue hecho sobre la marcha, ahora que ya se mucho más de lo que hay que hacer, viene bien replantear la estructura del código. Pero ese es tema para otro post 😉

Etiquetas: programación, blogschapines, mysql

7 thoughts on “Una mejor forma de seleccionar un fila al azar en MySQL

  1. Hola Javier:

    Me pasa lo mismo con mis maquinas en red en casa y me pide una clave pero cuando le meto admin nome la acepta.¿Cual será?. Te lo agradezco muchisimo aunque no me puedas ayudar solo con leer este mensaje.

    Muy Atentamente y muchas gracias,Julian.

  2. Muy buena solución.

    Ahora, me preguntaba como resolver el caso si quiero, por ejemplo, obtener 10 filas al azar, sin tener que hacer varias consultas sucesivas.

    Si se me ocurre algo te aviso…. o bien si se te ocurre a ti, agradezco que me avises.

    Saludos.

Comments are closed.