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
Página 1 de 1
Registros aleatorios con PHP y MySQL
#1
Escrito 30 abril 2008 - 07:03
Página 1 de 1
Otras respuestas a este tema
#2
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
De los tres métodos propuestos, obviamente he descartado la tercera forma, quedandome solo la primera y la segunda.
Pues no... no es la más lenta ni la menos eficiente y voy a probarlo
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
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?
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.
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.
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
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
#3
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
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 :-)
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?
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"
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"
Página 1 de 1

Conectar
Registrar
Ayuda



MultiCitas
