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

Cargas de datos muy lentas

Estas en el tema de Cargas de datos muy lentas en el foro de Bases de Datos General en Foros del Web. Hola a todos. Tengo un blog, de desarrollo propio, el cual, me trae por la calle de la amargura en cuestión de tiempos de carga. ...
  #1 (permalink)  
Antiguo 08/10/2009, 03:44
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Cargas de datos muy lentas

Hola a todos.

Tengo un blog, de desarrollo propio, el cual, me trae por la calle de la amargura en cuestión de tiempos de carga.

He optimizado al máximo (hasta donde llegan mis conocimientos) tal y como me han ido comentando en su correspondiente lugar de este foro (http://www.forosdelweb.com/f91/reduc...2/#post3114840))

He convertido la home (index) en estático para ver su carga, y la sorpresa es que tarda menos de 4 segundos en cargar, respecto al index "real" que carga todo desde la base de datos.

Podéis verlo en:

www.tumundobelleza.com/blog/index.php
www.tumundobelleza.com/blog/index_javi.htm

La diferencia es abismal.

Por ello, y viendo que son los mismos CSS, mismas imágenes, mismos JS... la única diferencia son las consultas a la Base de Datos.

- ¿Cómo puedo optimizarlas?
- ¿Cómo se puede mejorar?
- ¿cómo puedo saber si hay algún problema (cierre de conexiones, excedente de conexiones...? (descarto el "cierre de conexiones" porque tengo un include al final de todas las páginas, que comprueba la conexión, y si está abierta, la cierra).

Espero todo tipo de comentarios y ayudas, dado que mi jefe quiere esto solucionado desde hace bastante, y no doy doy el problema.

Un saludo y muchas gracias de antemano.

Javier
  #2 (permalink)  
Antiguo 08/10/2009, 07:09
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Cargas de datos muy lentas

Si es mucha la diferencia. Pero no sabemos ni como te conectas a la base de datos, ni las consultas que realizas para cargar la página. Sin esa info difícilmente te podemos ayudar.

Yo te recomiendo mires cuantas veces en el proceso de carga de la pagina debes hacer viajes al servidor de base de datos. Si requieres de 10 o 20 consultas, podríamos ayudarte a reducir ese numero de consultas a un numero menor y así evitar tantos viajes al servidor.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 08/10/2009, 09:32
 
Fecha de Ingreso: septiembre-2009
Mensajes: 124
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: Cargas de datos muy lentas

Si estas consultando a varias tablas de una base de datos MySQL. Te recomendaria que lo hagas con LEFT JOIN. Es una gran ventaja que tiene MySQL.

Si necesitas mas informacion, no dudes en consultar.

Saludos!
  #4 (permalink)  
Antiguo 08/10/2009, 10:15
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Cargas de datos muy lentas

Hola de nuevo.

Acabo de hacer un "destripado" del blog, para que veais el funcionamiento real.

He dividido el Blog en cada uno de sus bloques y módulos TOTALMENTE independientes que pueden sobrevivir sin necesidad de librerías ni dependencias de otros módulos.

Son los siguientes:

http://www.tumundobelleza.com/blog/i...dulo_login.php
Este módulo, no hace ninguna consulta a base de datos a no ser que se rellenen los datos y se manden (por ello, no resta velocidad de carga general mas que su peso de imágenes y CSS).

Añado un detalle: Todas las divisiones que he hecho, tienen en común que llevan al final un include para eliminar la conexión de la base de datos (en el caso de no haberse hecho) (sistema de seguridad)


http://www.tumundobelleza.com/blog/i...s_por_tema.php
Este módulo, saca un listado de todos los temas y un conteo de cantidad de POSTS referidos a ese tema (ordenados descendientemente).


http://www.tumundobelleza.com/blog/i...maquillaje.php
http://www.tumundobelleza.com/blog/i...obienestar.php
http://www.tumundobelleza.com/blog/i...umundomoda.php
http://www.tumundobelleza.com/blog/i...eofavorito.php
Estos módulos conectan con otro Blog (EXACTAMENTE IGUAL que el actual) para obtener sus últimos 9 posts publicados.
Los blogs están alojados en el mismo servidor (por lo que la comunicación sigue siendo interna)


http://www.tumundobelleza.com/blog/i...lo_central.php
Este módulo busca los 10 últimos posts, los muestra y prepara la paginación para navegar por todos los existentes.
Consulta varias tablas diferentes:
- Puntos obtenidos: Hace una suma de puntos totalas almacenados en otra tabla y saca la media
- Comentario: Cuenta cuantos comentarios ha tenido cada post y pone un enlace con la cantidad
- Cada vez que se entra a ver un módulo, se incrementa un contador en una tabla aparte como cantidad de lecturas
- Temas: Busca los temas asociados a cada uno de los posts para crear enlaces (tags)


http://www.tumundobelleza.com/blog/i...mas_leidos.php
Este módulo busca los post más leidos (respecto a una tabla con conteo de veces leídas cada post


http://www.tumundobelleza.com/blog/i...comentados.php
Este módulo busca los posts que más comentarios tienen.

En cada módulo se puede ver la Query que se está usando.

Si puedo aportaros más información, decírmelo y os la paso.

Un saludo.

Javier
  #5 (permalink)  
Antiguo 08/10/2009, 10:32
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Cargas de datos muy lentas

Vaya cantidad de consultas. Ante todo esto me parece una velocidad de carga razonable.

Pregunta:
Cita:
Añado un detalle: Todas las divisiones que he hecho, tienen en común que llevan al final un include para eliminar la conexión de la base de datos (en el caso de no haberse hecho) (sistema de seguridad)
Lo que dices es que para cada sección o consulta abres una conexión y la cierras? Después vuelves a abrir otra conexión realizas las consultas y vuelves y las cierras? Cuantas veces haces esto en index.php?

Recomendaciones:
1. abre una conexión inicial, ejecuta todas las consultas necesarias y cierrala al final.

2. con respecto a este post haces muchos conteos pero la consulta es la misma. Puedes crearte una función que ingrese los THEME_ID necesarios y te retorne todos los conteos en un solo viaje. Tratar de hacer lo mismo para consultas que solo cambien un valor.

Sospecho que lo que satura el sistema, es la cantidad de veces que se conecta y desconecta mysql de la aplicación y también la cantidad de veces que debe viajar al servidor para extraer la información. Si puedes mejorar eso, seguramente la velocidad de carga se verá muy mejorada.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 08/10/2009, 13:32
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Cargas de datos muy lentas

Hola huesos52

Gracias por tus comentarios.

Por partes:

Conexiones: Realmente, hacía una conexión en cada función de consulta a base de datos... un ERROR muy grande.

Acabo de subsanarlo, creando unas conexiones globales, y usando dichas conexiones (y al final de la página, por medio del include que comentaba anteriormente, elimino las conexiones.

De esta manera, parece que ha bajado el tiempo de carga (si no te importa entrar en la página general www.tumundobelleza.com/blog/index.php y ver si te carga más rápido, me lo puedes decir?) (es para descartar que veo reducción de tiempo sin haberla).


Post con muchos conteos: en este caso, si, quizás hago muchos conteos, pero no se me ocurre la manera de hacerlo bien.. quiero decir...
- Necesito los ID de los temas (y sis nombres) por lo que ya tenemos una consulta de base de datos.
- Necesito el total de POSTS por cada uno de los temas.. por lo que... ¿hago un select múltiple o cómo hacer esa consulta? (esque no se me ocurre cómo hacer la consulta para aligerar cargas....)

Espero más comentarios, que me están viniendo genial para mejorar las cargas.

Un saludo.

Javier
  #7 (permalink)  
Antiguo 08/10/2009, 13:56
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Cargas de datos muy lentas

Cita:
De esta manera, parece que ha bajado el tiempo de carga (si no te importa entrar en la página general www.tumundobelleza.com/blog/index.php y ver si te carga más rápido, me lo puedes decir?) (es para descartar que veo reducción de tiempo sin haberla).
Muchísimo mas rápido el_javi.
La primera vez se tardó casi 20 segundos en mi computador.
Esta vez fueron 8 segundos. (tiempo considerable)

Con respecto a los conteos... me dejé llevar por una forma que utilizo al trabajar en postgresql que permite retornar arrays de datos, pero creo que mysql no soporta.

La idea es minimizar al máximo los viajes entre servidor de BD y aplicación. Dame unos minutos y miro bien que posibilidades se pueden tomar para subsanar este problema. Por ahora ya tienes ganado un gran avance con la minimización de conexiones.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 08/10/2009, 14:10
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Cargas de datos muy lentas

Vamos a hacer una prueba.
Me imagino que esta consulta:
Código sql:
Ver original
  1. SELECT COUNT(t_posts_themes.POST_ID) AS TOTAL_POSTS FROM t_posts_themes LEFT JOIN t_posts ON t_posts_themes.POST_ID = t_posts.POST_ID WHERE t_posts_themes.THEME_ID = 7 AND t_posts.POST_options_erased = 0 AND t_posts.POST_enabled = 1 AND t_posts.POST_date_publish <= NOW()
la ejecutas y recoges uno a uno los valores de los conteos.

Une todas las consultas con union y recoge las variables como registros y no como columnas.
Me explico:
cuando ejecutas cada conteo, el valor retornado es: 347 o 346 (etc.) dependiendo del caso. y solo retorna un numero.
la idea es hacer algo como:
Código sql:
Ver original
  1. SELECT COUNT(t_posts_themes.POST_ID) AS TOTAL_POSTS
  2. FROM t_posts_themes LEFT JOIN t_posts ON
  3. t_posts_themes.POST_ID = t_posts.POST_ID
  4. WHERE t_posts_themes.THEME_ID = 7 AND
  5. t_posts.POST_options_erased = 0 AND
  6. t_posts.POST_enabled = 1 AND
  7. t_posts.POST_date_publish <= NOW()
  8. UNION ALL
  9. SELECT COUNT(t_posts_themes.POST_ID) AS TOTAL_POSTS
  10. FROM t_posts_themes LEFT JOIN t_posts ON
  11. t_posts_themes.POST_ID = t_posts.POST_ID
  12. WHERE t_posts_themes.THEME_ID = 6 AND
  13. t_posts.POST_options_erased = 0 AND
  14. t_posts.POST_enabled = 1 AND
  15. t_posts.POST_date_publish <= NOW()
  16. UNION ALL
  17. SELECT COUNT(t_posts_themes.POST_ID) AS TOTAL_POSTS
  18. FROM t_posts_themes LEFT JOIN t_posts ON
  19. t_posts_themes.POST_ID = t_posts.POST_ID
  20. WHERE t_posts_themes.THEME_ID = 5 AND
  21. t_posts.POST_options_erased = 0 AND
  22. t_posts.POST_enabled = 1 AND
  23. t_posts.POST_date_publish <= NOW()
  24. UNION ALL
  25. SELECT COUNT(t_posts_themes.POST_ID) AS TOTAL_POSTS
  26. FROM t_posts_themes LEFT JOIN t_posts ON
  27. t_posts_themes.POST_ID = t_posts.POST_ID
  28. WHERE t_posts_themes.THEME_ID = 2 AND
  29. t_posts.POST_options_erased = 0 AND
  30. t_posts.POST_enabled = 1 AND
  31. t_posts.POST_date_publish <= NOW()
  32. etc....

Asumo que usas funciones como mysql_fetch_array para extraer los datos e ingresarlos en variables php. Desde php podrías almacenar estos valores en un vector mientras recorres la consulta.

Como ayudaría esto?
Pues te ahorra 8 viajes al servidor para sacar la misma información y aunque quede mas compleja te traerá todos los datos igual

Pruebalo y nos cuentas
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 09/10/2009, 02:40
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años, 1 mes
Puntos: 10
Respuesta: Cargas de datos muy lentas

Hola huesos52

Ya he hecho el cambio de consulta respecto a la que hacía el conteo.

Era correcta la unión de selects que me has pasado, y hemos reducido en 10 las peticiones al servidor.

No se si ves (o veis) más posibilidades de optimizar las consultas y el trabajo en si.

Me comentas que te tarda 8 segundos en cargar.. a mi me tarda (marcado por Yslow) 23 segundos en cargar y sin caché (lipiada desde firefox) tarda 26,11 segundos) ¿Qué tienes una línea grande? (mi línea es de 6Mb (5,4 de bajada, testeado con speedtest.net)

Lo dicho, si veis más opciones de optimización, decírmelo para mejorar el trabajo.

Un saludo.

Javier
  #10 (permalink)  
Antiguo 09/10/2009, 07:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Cargas de datos muy lentas

Cita:
Me comentas que te tarda 8 segundos en cargar.. a mi me tarda (marcado por Yslow) 23 segundos en cargar y sin caché (lipiada desde firefox) tarda 26,11 segundos) ¿Qué tienes una línea grande? (mi línea es de 6Mb (5,4 de bajada, testeado con speedtest.net)
Tenés razón.
Era por la cache. se demora 22 segundos. Pero igual, me parece un tiempo muy razonable.

Trata de optimizar consultas de este modo y espero te haya servido de algo todos estos consejos.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
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 12:57.