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

Consultas Lentas

Estas en el tema de Consultas Lentas en el foro de Mysql en Foros del Web. Que onda Banda. mi problema es que al realizar la consulta mysql tarda 89.333 segundos en devolver 1000 resultados lo cual me lleva aun error ...
  #1 (permalink)  
Antiguo 01/10/2012, 14:16
Avatar de jmacc  
Fecha de Ingreso: marzo-2007
Ubicación: Mexico
Mensajes: 94
Antigüedad: 17 años, 1 mes
Puntos: 6
Pregunta Consultas Lentas

Que onda Banda.
mi problema es que al realizar la consulta mysql tarda
89.333 segundos en devolver 1000 resultados lo cual me lleva aun error a la hora de visualizar mis datos a través de la web.
Ya que dice que excede el tiempo.

Le deje al apache un tiempo limite de 80 seg y de memoria en 125 MB.

Quisiera saber si el tiempo es correcto o estoy teniendo problemas en mi base de datos.

Le doy mas memoria mas tiempo.
Les dejo un poco de informacion de mi consulta.
Código SQL:
Ver original
  1. id , select_type , TABLE , TYPE , possible_keys , KEY , key_len , REF , ROWS , Extra
  2. '1', 'SIMPLE', 'catstatusb', 'ALL', NULL, NULL, NULL, NULL, '6', 'Using temporary; Using filesort'
  3. '1', 'SIMPLE', 'grupos_beneficiarios', 'ALL', NULL, NULL, NULL, NULL, '2693', 'Using join buffer'
  4. '1', 'SIMPLE', 'localidad', 'ALL', NULL, NULL, NULL, NULL, '3939', 'Using join buffer'
  5. '1', 'SIMPLE', 'grupos1', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'ssd.grupos_beneficiarios.id_grupo', '1', ''
  6. '1', 'SIMPLE', 'grupos_beneficiarios_nivel', 'eq_ref', 'PRIMARY', 'PRIMARY','4','ssd.grupos_beneficiarios.id_nivel_grupo', '1', ''
  7. '1', 'SIMPLE', 'beneficiario', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'ssd.grupos_beneficiarios.id_beneficiario', '1', 'Using where'
  8. '1', 'SIMPLE', 'ocupacion_unitario', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'ssd.beneficiario.id_ocupacion_uni', '1', ''
  9. '1', 'SIMPLE', 'municipio', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'ssd.localidad.id_municipio', '1', 'Using index'
  10. '1', 'SIMPLE', 'ocupacion_principal', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'ssd.beneficiario.id_ocupacion', '1', 'Using index'
  11. '1', 'SIMPLE', 'ocupacion_subgrupo', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'ssd.beneficiario.id_ocupacionsub', '1', 'Using index'
  12. '1', 'SIMPLE', 'grupos', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'ssd.beneficiario.vertiente', '1', ''
  13. '1', 'SIMPLE', 'colonia', 'eq_ref', 'PRIMARY', 'PRIMARY', '8', 'ssd.beneficiario.id_colonia', '1', 'Using where'
Buena es algo de lo que les puedo compartir sera, que queda mal la estructura ya que fue algo que se realizo en chinga.
__________________
Los bueno Chicos Acaban Primero.
User Linux: #527435
  #2 (permalink)  
Antiguo 01/10/2012, 14:25
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 Lentas

Para darte una idea necesitamos la consulta y posiblemente una idea de la estructura de las tablas (CREATE TABLE, no una descripción).
El resultado del EXPLAIN, sin tener acceso a la base no nos dice mucho. Sólo sirve cuando estás analizando tu propia base.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/10/2012, 10:51
Avatar de jmacc  
Fecha de Ingreso: marzo-2007
Ubicación: Mexico
Mensajes: 94
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Consultas Lentas

Consulta SQL
Código MySQL:
Ver original
  1.     beneficiario.id_beneficiario as Id,
  2.     beneficiario.fecha_alta as Alta,
  3.     beneficiario.nombre as Nombre,
  4.     beneficiario.apepaterno as PrimerApellido,
  5.     beneficiario.apematerno as SegundoApellido,
  6.     beneficiario.edad as Edad,
  7.     beneficiario.telefono as Telefono,
  8.     beneficiario.celular as Celular,
  9.     grupos1.nombre_grupos as Grupo,
  10.     grupos.nombre as Vertiente,
  11.     colonia.nombre_colonia AS Colonia,
  12.     grupos_beneficiarios_nivel.nombre as Mesa,
  13.     ocupacion_unitario.nombre as Actividad,
  14.     catstatusB.nombreCatB as Estado
  15.     beneficiario
  16.         inner join
  17.     grupos1
  18.         inner join
  19.     grupos_beneficiarios
  20.         inner join
  21.     grupos
  22.         inner join
  23.     catstatusb
  24.         inner join
  25.     municipio
  26.         inner join
  27.     localidad
  28.         inner join
  29.     colonia
  30.         inner join
  31.     grupos_beneficiarios_nivel
  32.         inner join
  33.     ocupacion_principal
  34.         inner join
  35.     ocupacion_subgrupo
  36.         inner join
  37.     ocupacion_unitario
  38. where (beneficiario.id_beneficiario = grupos_beneficiarios.id_beneficiario)
  39.     and (beneficiario.vertiente = grupos.id_grupo)
  40.     and (beneficiario.autorizado = estadoCatB)
  41.     and (beneficiario.id_municipio = municipio.id)
  42.     and (beneficiario.id_localidad = localidad.id_localidad)
  43.     and (beneficiario.id_ocupacion = ocupacion_principal.id )
  44.     and (beneficiario.id_ocupacionsub = ocupacion_subgrupo.id)
  45.     and (beneficiario.id_ocupacion_uni = ocupacion_unitario.id)
  46.     and (beneficiario.id_colonia = colonia.id)  
  47.     and (municipio.id = localidad.id_municipio)
  48.     and (grupos1.id_grupos = grupos_beneficiarios.id_grupo)
  49.     and (grupos_beneficiarios.id_nivel_grupo = grupos_beneficiarios_nivel.id)
  50.     and beneficiario.fecha_alta between '2012-01-02' and '2012-10-01' order by grupos1.id_grupos
__________________
Los bueno Chicos Acaban Primero.
User Linux: #527435
  #4 (permalink)  
Antiguo 02/10/2012, 13:09
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 Lentas

La primera corrección que te haría es recordarte que esa no es exactamente la sintaxis de un INNER JOIN, y además que debes tener en cuenta que las relaciones declaradas entre tablas es conveniente ponerlas en el FROM y no en el WHERE.
Por otro lado, no has usado alias, lo que complica un poco la lectura.
Pero el problema mayor, que te está causando duplicación de registros y además mucha lentitud es que estás haciendo un JOIN en estrella (una tabla central a N tablas), y eso es lo que genera ese producto cartesiano.
Para solventarlo estás haciendo un DISTINCT, pero eso es insuficiente porque de todos modos puede estar dando un resultado algo inconsistente.
El primer acercamiento sería:
Código MySQL:
Ver original
  1.     B.id_beneficiario Id,
  2.     B.fecha_alta Alta,
  3.     B.nombre Nombre,
  4.     B.apepaterno PrimerApellido,
  5.     B.apematerno SegundoApellido,
  6.     B.edad Edad,
  7.     B.telefono Telefono,
  8.     B.celular Celular,
  9.     G1.nombre_grupos Grupo,
  10.     G.nombre Vertiente,
  11.     C.nombre_colonia Colonia,
  12.     GBN.nombre Mesa,
  13.     OU.nombre Actividad,
  14.     CA.estadoCatB
  15.  Estado
  16.     beneficiario B
  17.     INNER JOIN grupos_beneficiarios GB ON B.id_beneficiario = GB.id_beneficiario
  18.     INNER JOIN grupos1 G1 ON GB.id_grupos = G1.id_grupo
  19.     INNER JOIN grupos G  ON B.vertiente = G.id_grupo
  20.     INNER JOIN catstatusb CA  ON B.autorizado = CA.estadoCatB
  21.     INNER JOIN municipio M ON B.id_municipio = M.id
  22.     INNER JOIN localidad L ON (M.id = L.id_municipio
  23.  AND B.id_localidad = L.id_localidad)
  24.       INNER JOIN colonia C ON B.id_colonia = C.id
  25.     INNER JOIN grupos_beneficiarios_nivel GBN ON GB.id_nivel_grupo = GBN.id
  26.     INNER JOIN ocupacion_principal OP ON B.id_ocupacion = OP.id
  27.     INNER JOIN ocupacion_subgrupo OS ON B.id_ocupacionsub = OS.id
  28.     INNER JOIN ocupacion_unitario OU ON B.id_ocupacion_uni = OU.id
  29. WHERE B.fecha_alta BETWEEN '2012-01-02' AND '2012-10-01'
  30. ORDER BY G1.id_grupos
Como sugerencia, hay que definir un indice por beneficiarios.fecha_alta, como mínimo, para darle mejor performance. Pero eso será insuficiente si no pules las relaciones de modo que no se genere esa consulta en estrella, como te digo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 05/10/2012, 18:36
Avatar de jmacc  
Fecha de Ingreso: marzo-2007
Ubicación: Mexico
Mensajes: 94
Antigüedad: 17 años, 1 mes
Puntos: 6
Respuesta: Consultas Lentas

Grax por el aporte me sirvio. :)
__________________
Los bueno Chicos Acaban Primero.
User Linux: #527435

Etiquetas: cosultas, php, querys
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:05.