Ir al contenido



Foto

Consulta optimizar tiempo de ejecucion Mysql en php


  • Por favor identifícate para responder
12 respuestas en este tema

#1 chrismark182

chrismark182

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 13 febrero 2017 - 08:33

Buenos días,

 

Tengo un sistema web , que ya después de tiempo la tabla principal ya tiene como 1900 registros , y al cargar el todo listado de esa tabla se demora en cargar en el hosting como (10 seg) y en local como 33 segundos en la ejecución de php pero en phpmyadmin se demora 1 o 2 segundos.

 

Quería saber que puedo hacer para optimizar el tiempo de ejecución.

 

Como mas dato, mi tabla se cruza con otras tablas inner join , al comienzo quite eso solo como prueba para calcular la ejecución y aun así se me demora en cargar por si sola.

 

Que me aconsejan para la optimizar.

 

Saludos,


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.050 mensajes
  • LocationRepública Dominicana

Escrito 13 febrero 2017 - 08:48

Incluye los índices que intervienen en  los Joins y verás la diferencia.

 

Saludos.


  • 0

#3 chrismark182

chrismark182

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 13 febrero 2017 - 01:12

Incluye los índices que intervienen en  los Joins y verás la diferencia.

 

Saludos.

 

Pero si por si sola la tabla se demora en la visualización por que tendría que hacer en el inner join?  


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.050 mensajes
  • LocationRepública Dominicana

Escrito 13 febrero 2017 - 04:23

PhpMyAdmin crea índices temporales al momento ejecutarse la consulta de manera interna no del motor, por eso es bastante rápido, cuando hay muchos registros es más eficientes usar un índice porque organiza los datos de manera binaria y busca la coincidencia, prueba agregando un índice en los campos que utilizas en la sección where y ves los resultados luego crea un índice para los campos donde intervienen los joins.
  • 0

#5 chrismark182

chrismark182

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 13 febrero 2017 - 05:22

PhpMyAdmin crea índices temporales al momento ejecutarse la consulta de manera interna no del motor, por eso es bastante rápido, cuando hay muchos registros es más eficientes usar un índice porque organiza los datos de manera binaria y busca la coincidencia, prueba agregando un índice en los campos que utilizas en la sección where y ves los resultados luego crea un índice para los campos donde intervienen los joins.

 

 si ya estoy entiendo el tema de los indices, 

 

si mi consulta es esta:
 


php
  1. SELECT oi.id, v.placa, v.serie, c.nombre, c.apellido, oi.user_ing, oi.editar, oi.estado, oi.activo, e.e_id, e.e_titulo, a.a_id, a.a_titulo, u.comercial, oi.fecha_ing, oi.filefacturacion, oi.guiaremision, oi.pagocomision, oi.cobro, oi.nombreplan
  2. FROM orden_instalacion oi
  3. INNER JOIN vehiculo v ON oi.idvehiculo = v.id
  4. INNER JOIN cliente c ON oi.idcliente = c.id
  5. INNER JOIN usuario u ON oi.user_ing = u.u_id
  6. INNER JOIN empresa e ON u.empresa = e.e_id
  7. INNER JOIN agencia a ON u.agencia = a.a_id
  8. WHERE u.id_sec
  9. IN ( 1, 2, 3, 4, 5, 6, 7, 9, 11, 25, 29, 37 )
  10. ORDER BY oi.id DESC

Si te fijas mi where solo es en la tabla usuario, pero donde están los registros es en orden_instalacion , como debería armar mi indice.

 

Estuve buscando bastante información pero solo encuentro con una sola tabla. En este caso no se por poner el indice.

 


php
  1. CREATE INDEX index_orden_instalacion ON orden_instalacion(user_ing)

Como información intente crear un index de orden_instalacion es lo único que encontré. Que cuando hay un inner join se hace un indice del cruce en este caso user_ing .


  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.050 mensajes
  • LocationRepública Dominicana

Escrito 13 febrero 2017 - 05:37

Mmm y en orden_instalacion no hay un campo que se relacione con u.id_sec?, de todos modos dejo unis enlaces para que tengas una pista:

https://dev.mysql.co...mn-indexes.html

En tu caso crea un índice de tres columnas de orden instalación y tres de la tabla usuario.
  • 0

#7 chrismark182

chrismark182

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 14 febrero 2017 - 09:08

Mmm y en orden_instalacion no hay un campo que se relacione con u.id_sec?, de todos modos dejo unis enlaces para que tengas una pista:

https://dev.mysql.co...mn-indexes.html

En tu caso crea un índice de tres columnas de orden instalación y tres de la tabla usuario.

 

 

Respondiendo a tus preguntas,  en orden_instalacion no hay ningun campo id_sec O u.id_sec ,POR QUE SE REFIERE AL SECTOR DEL USUARIO QUE REGISTRO LA ORDEN DE INSTALACION. 

 

Por eso mi join solo esta relacionado el   oi.user_ing = u.u_id.

 

A que te refieres que con tres columnas de orden_instalacion y usuario?

 

Como comente antes , solo para verificar si los join hacian la demora, hice un select * from de orden_instalacion y aun así se demora.

 

Por eso mi confusión va por que hacer indices a la tabla usuario, si el que tiene los registros es orden_instalacion y la demora es solo eso.


  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.050 mensajes
  • LocationRepública Dominicana

Escrito 14 febrero 2017 - 01:48

Envíame una copia de las tablas intervenidas, mi correo está en mi perfil.


  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.050 mensajes
  • LocationRepública Dominicana

Escrito 15 febrero 2017 - 05:38

Hola, he recibido tu copia, quiero saber cómo muestras esos datos, y a través de qué lenguaje lo haces.

 

Saludos


  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.050 mensajes
  • LocationRepública Dominicana

Escrito 17 febrero 2017 - 07:13

Algunos consejos para optimizar tu código, muchas veces la lentitud no proviene de la consulta, sino, de la forma en que manejas la información en PHP (Igual que otros lenguajes):

 

- En PHP es mucho mejor trabajar con arreglos, es mucho más rápido.

- trata de utilizar lo menos posible funciones que hacen llamadas a la BD dentro de un for, while, foreach, etc.

- Trata de no mostrar todos los datos de un sólo tiro (en este caso 1900 registros), limita la consulta cada x registros, utiliza paginación de datos.

 

Saludos


  • 1

#11 chrismark182

chrismark182

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 17 febrero 2017 - 02:50

Algunos consejos para optimizar tu código, muchas veces la lentitud no proviene de la consulta, sino, de la forma en que manejas la información en PHP (Igual que otros lenguajes):

 

- En PHP es mucho mejor trabajar con arreglos, es mucho más rápido.

- trata de utilizar lo menos posible funciones que hacen llamadas a la BD dentro de un for, while, foreach, etc.

- Trata de no mostrar todos los datos de un sólo tiro (en este caso 1900 registros), limita la consulta cada x registros, utiliza paginación de datos.

 

Saludos

 

 

Bueno, escribo para agredecer la ayuda, que si me sirvió muchísimo. Ya estoy implementando las mejoras.

 

Con el tema de paginacion si esta implementado.

 

Pero ultima consulta si me dices que no ponga funciones dentro de un for, while u otra estructura repittiva entonces que me aconseja?


  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.050 mensajes
  • LocationRepública Dominicana

Escrito 17 febrero 2017 - 03:56

Me refiero funciones que hagan llamadas a bases de datos, porque fijate, un ejemplo, tienes 1900 registros y quieres obtener el nombre de un usuario o cliente llamarias a la bd 1900 veces, no crees que te alentaría?, mi consejo aqui que utilices left o right join dependiendo del caso y lo devuelves en una sola consulta, ese es solo un ejemplo.

Saludos
  • 1

#13 chrismark182

chrismark182

    Advanced Member

  • Miembros
  • PipPipPip
  • 65 mensajes

Escrito 17 febrero 2017 - 05:02

Me refiero funciones que hagan llamadas a bases de datos, porque fijate, un ejemplo, tienes 1900 registros y quieres obtener el nombre de un usuario o cliente llamarias a la bd 1900 veces, no crees que te alentaría?, mi consejo aqui que utilices left o right join dependiendo del caso y lo devuelves en una sola consulta, ese es solo un ejemplo.

Saludos

 

Okay, ya entendi.

 

Gracias por la ayuda. 

 

Ya puedo cerrar este tema.


  • 0