Foros del Web » Programando para Internet » PHP »

Problema con rand()

Estas en el tema de Problema con rand() en el foro de PHP en Foros del Web. Bueno, me funciona perfectamente la expresión ORDER BY rand() LIMIT 5, pero el problema es que tengo una base con menos de 100 filas y ...
  #1 (permalink)  
Antiguo 17/08/2007, 08:58
Avatar de Spydis  
Fecha de Ingreso: mayo-2003
Ubicación: Donosti
Mensajes: 90
Antigüedad: 20 años, 11 meses
Puntos: 1
Pregunta Problema con rand()

Bueno, me funciona perfectamente la expresión ORDER BY rand() LIMIT 5, pero el problema es que tengo una base con menos de 100 filas y cuando aumente he leido por ahi que rand() consume muchos recursos ya que hace operaciones complicadas y con muchas filas puede demorarse bastante...
Alguien sabe otra forma de extraer 5 (o el nº k sea) filas de una tabla de forma aleatoria?
Saludos!
  #2 (permalink)  
Antiguo 17/08/2007, 09:07
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Problema con rand()

No he visto que RAND tenga tantos problemas con el numero de filas, lo que hace es seleccionar registros aletorios y te limita si le das la clausula LIMIT.

En dado caso para cuando tengas una base de datos mayor (hablamos de miles de registros) puedes hacer una tarea programada que te haga un ordenamiento aleatorio y almacenar los registros, y que esa tarea aleatoria se ejecute 1 vez al dia, asi ahorras recursos.

Saludos.
  #3 (permalink)  
Antiguo 17/08/2007, 09:19
Avatar de Spydis  
Fecha de Ingreso: mayo-2003
Ubicación: Donosti
Mensajes: 90
Antigüedad: 20 años, 11 meses
Puntos: 1
Re: Problema con rand()

Mira esto lo extrai de una web:
Cita:
About selecting random rows from a MySQL table:

SELECT * FROM tablename ORDER BY RAND() LIMIT 1

works for small tables, but once the tables grow larger than 300,000 records or so this will be very slow because MySQL will have to process ALL the entries from the table, order them randomly and then return the first row of the ordered result, and this sorting takes long time. Instead you can do it like this (atleast if you have an auto_increment PK):

SELECT MIN(id), MAX(id) FROM tablename;

Fetch the result into $a

$id=rand($a[0],$a[1]);

SELECT * FROM tablename WHERE id>='$id' LIMIT 1
Pone que son para 300.000 registros, pero ahi solo pone el limit en 1 y lo aumentas en 5 hace mas operaciones. De todas formas he estado mirando y hay gente con problemas ya con 150 registros.
  #4 (permalink)  
Antiguo 17/08/2007, 09:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Problema con rand()

El limit no es el problema, la cuestion es que cuando tu haces:
Código:
SELECT * FROM table ORDER BY RAND()
Como bien dice la funcion ordenas de forma alatoria tus registros, luego al tu darle LIMIT X, solo lo que hace es devolverte esas X Filas, si no te devolveria toda la tabla, y como puedes ver es para 300,000 registros.

Si hay problemas con tablas de 150 registros creo o el ordenador es muy lento, o esta mal optimizado su servidor de bases de datos ya que 150 registros en MySQL son muy pocos, no creo que pasen de 50kb de espacio y eso para cualquier ordenador de hoy en dia es una operacion de menos de 0.01 segundos.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:14.