Registros aleatorios con PHP y MySQL - Foro Creativo

Ir a contenido

Página 1 de 1
  • No puedes empezar un nuevo tema
  • No puedes responder a este tema

Registros aleatorios con PHP y MySQL

#1 El usuario está offline   elQuique

  • Dibujante de Codigos
  • PipPipPipPipPipPip
  • Grupo: Admin Team
  • Mensajes: 21239
  • Registrado: 08-febrero 03
  • Location:Florida, Uruguay
  • Sexo:Masculino
  • País:Uruguay
  • Navegador:FireFox
  • Camara:Kodak/v1003

Escrito 30 abril 2008 - 07:03

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:
http://www.tallerweb...ySQL-c-132.html
0


Página 1 de 1
  • No puedes empezar un nuevo tema
  • No puedes responder a este tema

Otras respuestas a este tema

#2 El usuario está offline   cleptomano

  • Reciente
  • Grupo: Miembros
  • Mensajes: 1
  • Registrado: 19-octubre 08
  • Sexo:Masculino
  • Navegador:FireFox

Escrito 19 octubre 2008 - 10:21

Hola, como estan...

He leido el tutorial y me parece relamente interesante que hayan tantas formas de obtener un registro aleatorio smile.gif

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

CITA
Método 1: "ORDER BY RAND()"
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.


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


CÓDIGO

function getUser(){
    $result = array();
    
    // Consulta SQL
    $sql = "
    SELECT
        c.id_contacto,
        c.email
    FROM ts_contactos AS c
    ORDER BY RAND()
    LIMIT 1
    ";
    $resp = mysql_query($sql);
    if(mysql_num_rows($resp) > 0){
        $datos = mysql_fetch_assoc($resp);
        $result = $datos;
    }
    
    return $result;
}

for($i=0; $i<100; $i++){
    $user = getUser();
    echo "<p>Registro <strong>".($i+1)."</strong></p>";
    print_r($user);
    flush();
}


Registros devueltos en 30 segundos: 9





CÓDIGO

function getUser(){
    $result = array();
    
    // Consulta SQL
    $sql = "
    SELECT
        COUNT(*) AS total
    FROM ts_contactos AS c
    ";
    $resp = mysql_query($sql);
    $total = mysql_result($resp,0);
    
    // Consulta SQL
    $sql = "
    SELECT
        c.id_contacto,
        c.email
    FROM ts_contactos AS c
    LIMIT ".mt_rand(0,$total-1).",1
    ";
    $resp = mysql_query($sql);
    if(mysql_num_rows($resp) > 0){
        $datos = mysql_fetch_assoc($resp);
        $result = $datos;
    }
    
    return $result;
}

for($i=0; $i<100; $i++){
    $user = getUser();
    echo "<p>Registro <strong>".($i+1)."</strong></p>";
    print_r($user);
    flush();
}


Registros devueltos en 30 segundos: 4





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

Este tema ha sido editado por cleptomano: 19 octubre 2008 - 10:32

0

#3 El usuario está offline   alvlin

  • Forero
  • Pip
  • Grupo: Miembros
  • Mensajes: 12
  • Registrado: 16-julio 07
  • Location:Canelones - Uruguay
  • Sexo:Masculino
  • País:Uruguay
  • Navegador:Opera

Escrito 17 febrero 2009 - 11:27

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 smile.gif

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?
http://www.mysqlperf...-innodb-tables/
Este mismo artículo sugiere (en el último comentario) que se puede forzar a MySQL a utilizar un índice.


Saludos y gracias de nuevo :-)
"los hombres nobles eluden un esfuerzo realizando otro mucho mayor. Por no cortar una rosa, construyen un
palacio. Por no escuchar un reproche, ejercen la rectitud toda la vida. Por no bajarse del caballo, conquistan el
Asia"
-Alejandro Dolina, "Crónicas del Ángel Gris"
0

Página 1 de 1
  • No puedes empezar un nuevo tema
  • No puedes responder a este tema


Sitios Amigos: Tutoriales gratis | Foro de Webmasters | Foros de ComunidadHosting