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 comments

  1. Jorge Andres · April 20, 2008

    “Al alzar” o “al azar”…?

  2. Javier Aroche · April 20, 2008

    Holy crap! PEBKAC

  3. Julian Kempes · April 20, 2008

    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.

  4. Javier Aroche · April 20, 2008

    Julian, no entiedo de que hablas.

  5. Luciano · April 20, 2008

    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.

  6. talishte · April 22, 2008

    Porque no les das unos tips a los de twitter

  7. talishte · April 22, 2008

    A por cierto, como le puedo hacer un ping a Blogs Chapínes, he notado que mis post salen con uno o dos días de atraso.

Comments are closed.