Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consultas mysql

Estas en el tema de Consultas mysql en el foro de Mysql en Foros del Web. Que tal! tengo un gran problema, estoy realizando una aplicación la cual es de busqueda en una base de datos con millones de registros, mi ...
  #1 (permalink)  
Antiguo 12/05/2009, 16:51
Avatar de brygom  
Fecha de Ingreso: marzo-2008
Mensajes: 79
Antigüedad: 16 años, 1 mes
Puntos: 0
Consultas mysql

Que tal! tengo un gran problema, estoy realizando una aplicación la cual es de busqueda en una base de datos con millones de registros, mi problema radica en que al realizar una busqueda en especifico esta puede devolver miles y miles de registros, yo cuando hago la busqueda voy almacenando los resultados en una Lista para luego devolverla y mostrarla en un Grid, no va ni a la mitad la busqueda y la memoria ya esta al tope, existe otra forma de realizar este tipo de busquedas? ó estoy realizando algo demasiado mal?
Espero me puedan ayudar, esto lo estoy desarrollando en Java y mostrando los datos en un DataTable de ICefaces.

Saludos y gracias por sus respuestas.
  #2 (permalink)  
Antiguo 12/05/2009, 16:58
rqd
 
Fecha de Ingreso: julio-2008
Mensajes: 228
Antigüedad: 15 años, 9 meses
Puntos: 8
Respuesta: Consultas mysql

¿ya probaste utilizando la sentecia LIMIT ?
  #3 (permalink)  
Antiguo 12/05/2009, 19:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consultas mysql

En realidad es posible que estés haciendo una consulta con una terrible falta de optimización.
Entendamos esto: Una consulta, para ser útil, incluso a nivel empresarial, debe devolver un listado que el Gerente pueda leer en no más de dos carillas (una de ser posible). Si tiene más que eso es papel para archivar pero nadie lo lee.
Con esto quiero decir, que si tienes que procesar millones de datos no importa, pero la información finalmente debe tener un importante nivel de agregación o no tendrá utilidad. Según eso, el tema es que estás intentando coleccionar ciertos datos que cumplen ciertos criterios, pero esperas luego volver a procesar eso para obtener la síntesis usable ¿no es así?
En los hechos, significa que estás desaprovechando las posibilidades del SQL de responder a la demanda. Lo que tienes que planear es:
1. Qué información tendrá la síntesis final.
2. Que tablas contienen la información que pueda dar ese resultado.
3. Que tablas puedes usar en sucesivos JOIN, LEFT JOIN, INNER JOIN o RIGHT JOIN para crear tablas de síntesis intermedias.
4. Cómo combinar las tablas intermedias en un conjunto menor de tablas con la mayor reducción de registros.
5. Cómo sería la consulta que te devuelva la síntesis sobre la base de las tablas de tercer orden.

En ocasiones, todos estos pasos se resumen en generar una sola consulta con una sucesión de subconsultas que te de el resultado final.
Para darte una idea, tengo una base que guarda el desempeño de vehículos de carga con muestreo del orden de los 5 segundos por registro. Sobre la base de 150 vehículos en 2 meses, debo generar un reporte de consumos de combustible y velocidades, faltas, kilometrajes y descansos de toda la flota. Son aproximadamente 155.520.000 de registros. Uso un solo SP que crea y destruye 5 tablas intermedias, para darme el reporte... en 3:20 minutos. Todo en SQL.
El tema pasa, entonces, por optimización de consultas.

Vuelve al papel y empieza a planear la consulta por etapas. No tengas miedo de crear tablas intermedias (solamente acuérdate de destruirlas una vez obtenido el resultado final), son muy útiles y bastante eficientes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 17:20.