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

agilizar busqueda que tarda mucho

Estas en el tema de agilizar busqueda que tarda mucho en el foro de Mysql en Foros del Web. buenas, tengo una bd con varias tablas. es una web en la que hay registrados unos 10.000 registros de productos. el problema es que he ...
  #1 (permalink)  
Antiguo 22/02/2010, 12:18
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
agilizar busqueda que tarda mucho

buenas,

tengo una bd con varias tablas. es una web en la que hay registrados unos 10.000 registros de productos.

el problema es que he hecho una busqueda personalizada por diferentes parametros, diferentes listas desplgables en php que me hacen referencia a datos de mis bd.

el problema es que en su dia, para 'agilizar' o eso pensaba yo, separe los datos en diferentes tablas. y la busqueda, la hago tal que asi:

Código HTML:
SELECT * FROM info_productos INNER JOIN compra_productos WHERE... INNER JOIN... 
y asi hasta 4 INNER JOIN, para las 4 tablas. las consultas me funcionan, pero tardan varios minutos en cargar. puedo agilizar la busqueda de alguna manera?

saludos
  #2 (permalink)  
Antiguo 22/02/2010, 13:30
 
Fecha de Ingreso: enero-2010
Ubicación: Sevilla
Mensajes: 202
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: agilizar busqueda que tarda mucho

Te recomiendo que hagas vistas sobre las distintas tablas y luego hagas JOIN con las vistas, de esta manera tendrás los registros filtrados y serán muchos menos. Esto es particularmente importante para la tabla en la que tengas un gran número de registros.
__________________
Mi blog de temas más o menos técnicos

Y aquí el Jamón jamon de Jabugo
  #3 (permalink)  
Antiguo 22/02/2010, 13:55
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: agilizar busqueda que tarda mucho

En mi opinión debes indexar los campos que utilizas para filtrar la consulta en el where.

SI pones toda la consulta, tal vez veamos una forma mas eficiente de ejecutarla.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 22/02/2010, 15:06
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: agilizar busqueda que tarda mucho

gracias,

aqui os dejo la consulta completa:

Código:
SELECT datos_personales.nombre,datos_personales.apellidos,datos_personales.sexo,datos_personales.provincia,datos_personales.fecha_nacimiento,
datos_estudios.nivel,datos_otros.disponibilidad_horaria,datos_otros.viajar,datos_otros.vehiculo,datos_otros.permiso_conducir 
FROM datos_candidatos INNER JOIN datos_personales ON datos_candidatos.idcandidato = datos_personales.idcandidato 
INNER JOIN datos_estudios ON datos_candidatos.idcandidato = datos_estudios.idcandidato INNER JOIN datos_otros 
ON datos_candidatos.idcandidato = datos_otros.idcandidato  $where_sql
donde el WHERE lo voy generando segun la opcion seleccionada, con codigo PHP

a ver si asi me podeis orientar. los datos del select son los datos que muestro en pantalla, es decir, es el listado que genero. y luego abro mediante el idcandidato la ficha completa.

saludos!
  #5 (permalink)  
Antiguo 22/02/2010, 15:28
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: agilizar busqueda que tarda mucho

Código MySQL:
Ver original
  1.     DP.nombre,
  2.     DP.apellidos,
  3.     DP.sexo,
  4.     DP.provincia,
  5.     DP.fecha_nacimiento,
  6.     DP.nivel,
  7.     DP.disponibilidad_horaria,
  8.     DP.viajar,
  9.     DP.vehiculo,
  10.     DP.permiso_conducir
  11.     datos_candidatos DC
  12.     INNER JOIN datos_personales DP ON DC.idcandidato = DP.idcandidato
  13.     INNER JOIN datos_estudios DE ON DC.idcandidato = DE.idcandidato
  14.     INNER JOIN datos_otros DO ON DC.idcandidato = DO.idcandidato  
  15. $where
A mi entender, lo que te plantea Huesos52 es lo único que puede mejorar la performance de esta consulta, porque la selección está optimizada al máximo posible, ya que las relaciones están creadas sobre la PK y en ese sentido no hay mejor selectibilidad.
Si deberías crear índices INDEX sobre los campos datos_estudio.idcandidato y datos_otros.idcandidato, ya que son los usados para el INNER JOIN y la relación debe ser 1:N en esos casos.
A esos índices, habría que agregarles los que puedas definir para los parámetros del WHERE, como dice Huesos52.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 22/02/2010, 15:44
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: agilizar busqueda que tarda mucho

gracias compi.

entonces segun me comentas, tengo la consulta bastante bien optimizada? con los cambios que sugeris, aplicados en la consulta que me muestras creando los indices DP, DO... etc... podemos mejorar la velocidad de busqueda?

saludos
  #7 (permalink)  
Antiguo 22/02/2010, 15:56
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: agilizar busqueda que tarda mucho

Hasta lo que vemos, solamente te queda rtatar de mejorar la performance de la consulta por medio de índices, porque la consulta está bien escrita.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 22/02/2010, 16:03
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: agilizar busqueda que tarda mucho

lo que veis es lo que hay. la consulta se genera mediante las opciones seleccionadas y es algo asi:

Código PHP:

if ( $viajar != "" )
{
    
$where[] = "datos_otros.viajar='$viajar'";
}
....

if( empty(
$where) ) 
{
   
$where_sql ="";
    
}

if( !empty(
$where) ) 

    
$where_sql 'WHERE '.implode(' AND '$where); 
    
$where_sql $where_sql."AND datos_candidatos.estado='activo'";


y asi creo el WHERE de la consulta, el cual puede ser tan largo como las opcioones de busqueda seleccionadas. esto se puede mejorar¿

saludos
  #9 (permalink)  
Antiguo 23/02/2010, 13:38
 
Fecha de Ingreso: enero-2010
Ubicación: Sevilla
Mensajes: 202
Antigüedad: 14 años, 3 meses
Puntos: 5
Respuesta: agilizar busqueda que tarda mucho

Después de ver tu consulta, creo que algo que te vendría bien para optimizar la consulta (además de las vistas de mi post anterior y los índices) sería que los valores por los que buscas estén tabulados en lugar de ser cadenas de texto.

Me explico, si tienes varios estados 'activo', 'inactivo',...

Es mucho más eficiente tenerlos en una tabla y buscar por el valor numérico en lugar de la cadena.


ID VALOR
1 activo
2 inactivo
...
__________________
Mi blog de temas más o menos técnicos

Y aquí el Jamón jamon de Jabugo

Etiquetas: tarda, busquedas
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 01:03.