1. ¡OFERTA! con cupón "DIRVPS": hosting por $0,01 y también VPS Linux y Windows por $0,01 el primer mes por Interserver ← publi
    Descartar aviso
Descartar aviso
Al usar este sitio web, aceptas que nosotros y nuestros socios podamos establecer cookies para fines tales como personalizar el contenido y la publicidad. Más información.

Registros aleatorios con PHP y MySQL

Tema en 'Tutoriales Desarrollo Web' iniciado por elQuique, 30 Abr 2008.

  1. elQuique

    elQuique Usuario activo

    En este tutorial, Alvlin nos enseña a obtener registros de forma aleatoria de una base de datos, lo cual tiene diferentes usos: mostrar una imagen de forma aleatoria, mostrar publicidad que sea diferente para cada página cargada, los enlaces "artículo aleatorio" de la Wikipedia, y muchos más.

    Ver tutorial en Taller Webmaster:
    <a href="http://www.tallerwebmaster.com/Tutorial-Registros-aleatorios-con-PHP-y-MySQL-c-132.html" target="_blank">http://www.tallerwebmaster.com/Tutorial-Re...ySQL-c-132.html</a>
     
  2.  
  3. cleptomano

    cleptomano Guest

    Hola, como estan...

    He leido el tutorial y me parece relamente interesante que hayan tantas formas de obtener un registro aleatorio :)

    De los tres métodos propuestos, obviamente he descartado la tercera forma, quedandome solo la primera y la segunda.

    <!--quoteo--><div class='quotetop'>CITA</div><div class='quotemain'><!--quotec--> <b>Método 1: "ORDER BY RAND()"</b>
    Esta es la forma ampliamente usada, no solo en MySQL pero en muchos otros sistemas también. Se podría decir que es una solución "normal" para el problema. Sin embargo, es probablemente la forma más lenta y menos eficiente de hacerlo.<!--QuoteEnd--></div><!--QuoteEEnd-->

    Pues no... no es la más lenta ni la menos eficiente y voy a probarlo :D


    <!--c1--><div class='codetop'>CÓDIGO</div><div class='codemain'><!--ec1-->
    function getUser(){
    &nbsp;&nbsp;&nbsp;&nbsp;$result = array();
    &nbsp;&nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;// Consulta SQL
    &nbsp;&nbsp;&nbsp;&nbsp;$sql = "
    &nbsp;&nbsp;&nbsp;&nbsp;SELECT
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.id_contacto,
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.email
    &nbsp;&nbsp;&nbsp;&nbsp;FROM ts_contactos AS c
    &nbsp;&nbsp;&nbsp;&nbsp;ORDER BY RAND()
    &nbsp;&nbsp;&nbsp;&nbsp;LIMIT 1
    &nbsp;&nbsp;&nbsp;&nbsp;";
    &nbsp;&nbsp;&nbsp;&nbsp;$resp = mysql_query($sql);
    &nbsp;&nbsp;&nbsp;&nbsp;if(mysql_num_rows($resp) > 0){
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$datos = mysql_fetch_assoc($resp);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result = $datos;
    &nbsp;&nbsp;&nbsp;&nbsp;}
    &nbsp;&nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;return $result;
    }

    for($i=0; $i<100; $i++){
    &nbsp;&nbsp;&nbsp;&nbsp;$user = getUser();
    &nbsp;&nbsp;&nbsp;&nbsp;echo "<p>Registro <strong>".($i+1)."</strong></p>";
    &nbsp;&nbsp;&nbsp;&nbsp;print_r($user);
    &nbsp;&nbsp;&nbsp;&nbsp;flush();
    }
    <!--c2--></div><!--ec2-->

    Registros devueltos en 30 segundos: 9





    <!--c1--><div class='codetop'>CÓDIGO</div><div class='codemain'><!--ec1-->
    function getUser(){
    &nbsp;&nbsp;&nbsp;&nbsp;$result = array();
    &nbsp;&nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;// Consulta SQL
    &nbsp;&nbsp;&nbsp;&nbsp;$sql = "
    &nbsp;&nbsp;&nbsp;&nbsp;SELECT
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(*) AS total
    &nbsp;&nbsp;&nbsp;&nbsp;FROM ts_contactos AS c
    &nbsp;&nbsp;&nbsp;&nbsp;";
    &nbsp;&nbsp;&nbsp;&nbsp;$resp = mysql_query($sql);
    &nbsp;&nbsp;&nbsp;&nbsp;$total = mysql_result($resp,0);
    &nbsp;&nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;// Consulta SQL
    &nbsp;&nbsp;&nbsp;&nbsp;$sql = "
    &nbsp;&nbsp;&nbsp;&nbsp;SELECT
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.id_contacto,
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.email
    &nbsp;&nbsp;&nbsp;&nbsp;FROM ts_contactos AS c
    &nbsp;&nbsp;&nbsp;&nbsp;LIMIT ".mt_rand(0,$total-1).",1
    &nbsp;&nbsp;&nbsp;&nbsp;";
    &nbsp;&nbsp;&nbsp;&nbsp;$resp = mysql_query($sql);
    &nbsp;&nbsp;&nbsp;&nbsp;if(mysql_num_rows($resp) > 0){
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$datos = mysql_fetch_assoc($resp);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result = $datos;
    &nbsp;&nbsp;&nbsp;&nbsp;}
    &nbsp;&nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;return $result;
    }

    for($i=0; $i<100; $i++){
    &nbsp;&nbsp;&nbsp;&nbsp;$user = getUser();
    &nbsp;&nbsp;&nbsp;&nbsp;echo "<p>Registro <strong>".($i+1)."</strong></p>";
    &nbsp;&nbsp;&nbsp;&nbsp;print_r($user);
    &nbsp;&nbsp;&nbsp;&nbsp;flush();
    }
    <!--c2--></div><!--ec2-->

    Registros devueltos en 30 segundos: 4





    Las 2 pruebas la hize sobre una tabla con 780mil registros, ahora... ¿cúal es mejor?
     
  4. alvlin

    alvlin Nuevo usuario

    Hola cleptomano,
    Soy el autor del "tutorial", me gusta mucho ver un comentario fundamentado y que me obliga a investigar más del tema.

    Creo que la frase de "peor y menos eficiente" no debería estar ahí, es una de las cosas que voy a quitar cuando edite el artículo (estoy pensando en rediseñar mi sitio y reescribir algunas cosas). Estas cosas siempre dependen de la tabla y de los datos que tenga.

    Me gustaría ver, en realidad, una prueba más: ¿qué pasa si mueves el COUNT() fuera del bucle? Debería cambiar las cosas :)

    Otra cosa que he encontrado por ahí, investigando a raíz de tu comentario, es que las tablas InnoDB no guardan (o al menos, no guardaban) un número de filas, como sí lo hace MyISAM. Por lo que el rendimiento en consultas que incluyan COUNT sin WHERE siempre requiere un 'full table scan', lo cual lo hace más lento. ¿Será que tu tabla es InnoDB?
    <a href="http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/" target="_blank">http://www.mysqlperformanceblog.com/2006/1...-innodb-tables/</a>
    Este mismo artículo sugiere (en el último comentario) que se puede forzar a MySQL a utilizar un índice.


    Saludos y gracias de nuevo :)
     


Alojamiento web, Hosting Reseller, Servidores Dedicados - All in Hosting


    
    
    
    
Blog · Sitios amigos: GuiaHosting · Unidominios · Interalta ·