Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Consultas demasiado grandes a la base de datos.

Estas en el tema de Consultas demasiado grandes a la base de datos. en el foro de PHP en Foros del Web. Buenas estoy teniendo el problema de que al intentar traer los datos de una db completos son tantos que ni siquiera llega a cargar, mi ...
  #1 (permalink)  
Antiguo 18/09/2014, 05:01
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 5 años, 10 meses
Puntos: 3
Pregunta Consultas demasiado grandes a la base de datos.

Buenas estoy teniendo el problema de que al intentar traer los datos de una db completos son tantos que ni siquiera llega a cargar, mi pregunta es si hay alguna forma de traerlos todos a la vez y si no como me aconsejarían que lo hiciera, es necesario para hacer el stock de cosas de un almacén.

Muchas gracias de antemano, un abrazo.

Última edición por Charlie1; 18/09/2014 a las 05:13
  #2 (permalink)  
Antiguo 18/09/2014, 07:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 5 meses
Puntos: 573
Respuesta: Consultas demasiado grandes a la base de datos.

Para poder aconsejarte falta mucha información. Estructura de la bbdd, tipo de consultas... etc.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 18/09/2014, 07:19
 
Fecha de Ingreso: enero-2011
Ubicación: Barcelona
Mensajes: 36
Antigüedad: 8 años, 7 meses
Puntos: 5
Respuesta: Consultas demasiado grandes a la base de datos.

Hola Charlie1,

Muy grande ha de ser la base de datos para no poder traerlos todos....

Intenta coger solo los necesarios en vez de poner * en el select.
Si es Mysql puedes limitar los resultado con LIMIT(0,1000);
Si es Sql puedes limitar los resultado con OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY o mediante TOP 1000

Pero insisto en que muy grande ha de ser esa base de datos, puede que este mal realizada la consulta...
  #4 (permalink)  
Antiguo 18/09/2014, 08:10
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 5 años, 10 meses
Puntos: 3
Respuesta: Consultas demasiado grandes a la base de datos.

Pues es una base de datos es mysql la consulta la hago con el constructor de consultas de laravel, esta es la consulta:

Código PHP:
$pedidos DB::select("SELECT id,ID_CAJA,ID_ALMACEN,ESTANTERIA,HUECO,PALET FROM cajas 
WHERE (ID_CAJA BETWEEN $id1 AND $id2) 
ORDER BY ID_CAJA ASC"
); 
Y solo traigo lo necesario, pero al ser más de 100000 registros no los carga todos por mucho que se quiera, puse el BETWEEN para ver cuanto llegaba a cargar y no más de 71000 registros.

El dilema es que no me sirve limitar dado que necesito todos para poder calcular cuantos productos hay en la db.

Gracias por vuestras respuestas

Saludos.

Última edición por Charlie1; 18/09/2014 a las 08:22
  #5 (permalink)  
Antiguo 18/09/2014, 08:54
 
Fecha de Ingreso: enero-2011
Ubicación: Barcelona
Mensajes: 36
Antigüedad: 8 años, 7 meses
Puntos: 5
Respuesta: Consultas demasiado grandes a la base de datos.

Puedes decirnos cual es el error que arroja? Yo acabo de listar 89.000 resultados y sin problema (es SQL), tarda un poco, pero no da error.

Y tambine podrias probar con SELECT count(id) as total FROM tabla

Esto deberia devolverte el numero total de filas. Si consigues ese nuemro podras fraccionar la consulta para almacenarla toda en un solo array.
  #6 (permalink)  
Antiguo 18/09/2014, 09:23
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 5 años, 10 meses
Puntos: 3
Respuesta: Consultas demasiado grandes a la base de datos.

Lo raro es que solo muestra la página en blanco y no da ningún tipo de error, no sigue con la ejecución de la consulta sin más.
  #7 (permalink)  
Antiguo 18/09/2014, 10:00
 
Fecha de Ingreso: enero-2011
Ubicación: Barcelona
Mensajes: 36
Antigüedad: 8 años, 7 meses
Puntos: 5
Respuesta: Consultas demasiado grandes a la base de datos.

Que raro, y la consulta del count te funciona?
  #8 (permalink)  
Antiguo 18/09/2014, 10:19
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 5 años, 10 meses
Puntos: 3
Respuesta: Consultas demasiado grandes a la base de datos.

Sí, me da el total de registros de la db.
  #9 (permalink)  
Antiguo 18/09/2014, 10:26
Avatar de Dalam  
Fecha de Ingreso: septiembre-2010
Mensajes: 409
Antigüedad: 8 años, 11 meses
Puntos: 56
Respuesta: Consultas demasiado grandes a la base de datos.

si estas en un servidor de produccion lo mas normal esque no te lance errores a no ser que sean criticos prueba a poner el registro de errores a e-all para que muestre todos los errores y si no en los log de mysql tendra que ponerte los errores generados.
Miralos y dinos lo que te salga
__________________
http://www.roglastudios.es
  #10 (permalink)  
Antiguo 18/09/2014, 10:37
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 5 años, 10 meses
Puntos: 3
Respuesta: Consultas demasiado grandes a la base de datos.

He probado tanto en local como producción solo sale la página en blanco(si hace más de las 71000 consultas que mencioné antes si son menos carga bien) laravel trae el debug mode y arroja todos los errores, pero tampoco muestra nada en este caso, a ver en los logs de mysql, pero no creo.
  #11 (permalink)  
Antiguo 18/09/2014, 10:44
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 5 años, 10 meses
Puntos: 3
Respuesta: Consultas demasiado grandes a la base de datos.

No muestra nada en el log de mysql tampoco, esto es super raro.
  #12 (permalink)  
Antiguo 18/09/2014, 10:47
Avatar de Dalam  
Fecha de Ingreso: septiembre-2010
Mensajes: 409
Antigüedad: 8 años, 11 meses
Puntos: 56
Respuesta: Consultas demasiado grandes a la base de datos.

puedes activar el log de mysql para consultas lentas
Cita:
mysqladmin var |grep log_slow_queries
| log_slow_queries | OFF
Si esta en On esque ya esta activado y lo podemos usar, por defecto viene desactivado.
la variable long_query_time que por defecto viene dado con un 1 son el numero de segundos desde donde mysql considera una consulta como lenta.
Para activar el registro debes de editar el archivo de configuracion my.cnf y en la seccion mysqld añade esto
Cita:
[mysqld]
long_query_time = 20
log-slow-queries = /var/log/mysql/mysql-slow.log
con esto mysql registrara las consultas que tarden mas de 20 segundos.
Aparte de esto con mysql el uso de indices es de buena ayuda para busquedas grandes.
Si tienes problemas con el planteamiento de tu base de datos pregunta en el foro de DB por que te responderan mejor.
Pero no deberia darte problemas, por que yo tengo sistemas con mas de 30 millones de resultados y no tengo problemas en buscar todas las filas.
Tienes que tener encuenta que tienes tres cosas que tener en cuenta para tablas grandes
Buffers
Indices
Consultas
Pero esto te lo sabran responder algo mejor en ese foro.
Pide a un colaborador que mueva el tema de php a mysql.
Un saludo
__________________
http://www.roglastudios.es
  #13 (permalink)  
Antiguo 18/09/2014, 10:55
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 5 años, 10 meses
Puntos: 3
Respuesta: Consultas demasiado grandes a la base de datos.

Hay que pedirlo desde aquí? Si es así me gustaria que este tema se moviera a mysql y muchas gracias a todos por la ayuda.

Saludos!
  #14 (permalink)  
Antiguo 19/09/2014, 07:01
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 5 años, 10 meses
Puntos: 3
Respuesta: Consultas demasiado grandes a la base de datos.

Buenas chicos, ya conseguí que funcione, no exactamente como lo proponía en un principio pero fraccionando la petición y aumentando el límite de memoria php que permitía el servidor a 256M parece que todo va como la seda, os dejo el código

Código PHP:
                            $total DB::select("SELECT count(id) as count FROM cajas");                            
                            
$total $total[0]->count;
                            
$idF   0;
                            
$pedidos = array();

                            for (
$i 0$i <= $id2 && $i <= $total$i)
                            {                                
                                
$idF += 50000;

                                
$query DB::select("SELECT id,ID_CAJA,ID_ALMACEN,ESTANTERIA,HUECO,PALET FROM cajas 
                                WHERE (id BETWEEN $id1 AND $idF) 
                                ORDER BY ID_CAJA ASC"
);

                                
$id1 += 50000;

                                
$i    $idF

                                
$pedidos array_merge($pedidos$query);                            
                            } 
Gracias a todos por la ayuda y espero que esto os ayude a los que tengáis un problema parecido.

Saludos!

Etiquetas: consulta-mysql, demasiado, grandes
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 20:33.