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

[SOLUCIONADO] Consulta de tablas relacionadas

Estas en el tema de Consulta de tablas relacionadas en el foro de Mysql en Foros del Web. Buenas tardes, Tengo dos tablas en mySql, una de personas y otra de direcciones. Me gustaría poder realizar una conulta para leer los datos de ...
  #1 (permalink)  
Antiguo 11/05/2013, 08:08
 
Fecha de Ingreso: abril-2012
Mensajes: 124
Antigüedad: 12 años
Puntos: 3
Consulta de tablas relacionadas

Buenas tardes,

Tengo dos tablas en mySql, una de personas y otra de direcciones.
Me gustaría poder realizar una conulta para leer los datos de las personas de una población en concreto.

Código:
SELECT persona.* FROM persona INNER JOIN direccion ON persona.id_direccion = direccion.id WHERE direccion.ciudad = 'Toledo' ORDER BY persona.fecha_alta LIMIT 0, 10
Creo que funciona bien, pero tarda mucho en hacer la consulta. La base de datos tiene unos pocos miles de registros.

Hay algún modo de optimizar la consulta?

Gracias.
  #2 (permalink)  
Antiguo 11/05/2013, 09:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta de tablas relacionadas

Imagino que tendrás indexados los campos id_direccion de la tabla persona, que id de direccion es Primary Key, y que el campo ciudad de dirección está indexado. Eso hará que todo vaya más deprisa. Prueba y nos dices.
  #3 (permalink)  
Antiguo 11/05/2013, 09:34
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Respuesta: Consulta de tablas relacionadas

Hola danicasas.

Te puedo pedir un favor, te puedo pedir si puedes copiar el archivo que te genera a la hora de exportar la informacion que tienes en la base de datos ?

Te explico, cuando tu realizas una consulta con INNER JOIN, lo que realizas implicitamente es crear una tabla con la multiplicidad de todas las tablas que tengas con inner join, es decir que si tus dos(2) tablas tienen 30 registros cada una, lo que realizas es crear virtualmente una tabla con 900 registros, y sobre esa tabla es donde el motor de mysql se pone a trabajar para entregarte los datos que solicitas, es por eso que como bien explica juarena, deberias tener bien indexados tus indices, y tambien tratar de utilizar LEFT JOIN identificando sobre que tabla es la que deseas obtener tus resultados.

Espero haber ayudado en algo.
Saludos.
  #4 (permalink)  
Antiguo 11/05/2013, 10:22
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: Consulta de tablas relacionadas

Cita:
cuando tu realizas una consulta con INNER JOIN, lo que realizas implicitamente es crear una tabla con la multiplicidad de todas las tablas que tengas con inner join, es decir que si tus dos(2) tablas tienen 30 registros cada una, lo que realizas es crear virtualmente una tabla con 900 registros,
@max_mouse699: Estás confundiendo el INNER JOIN con el JOIN implícito no relacionado.
Lo que estás describiendo es el caso del producto cartesiano, que sólo ocurre cuando no existe relación entre las dos tablas, entonces se genera.
Pero el INNER JOIN implica que sólo se relacionarán aquellos registros de acuerdo al criterio rel ON. En ese caso sólo devolverá las direcciones de cada una de las personas de la tabla persona. se podrán repetir registros de personas en aquellos casos donde la persona tenga más direcciones, y no saldrán los datos de la que no tenga dirección declarada. Pero en ningún caso podrán salir datos no relacionados.

El problema de lentitud puede estar dado en que el campo indicado en el WHERE no está debidamente indexado, o bien que "Toledo" aparezca como entrada de más de un determinado porcentaje de los registros de esa tabla, lo que puede causar que MySQL descarte usar el índice y realice un full tablescan. Y eso sí es un errro de optimización.
__________________
¿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 11/05/2013, 22:14
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Respuesta: Consulta de tablas relacionadas

@gnzsoloyo: tienes toda la razon, me disculpo ante la equivocacion, me confundi.

Segun investigancion, la lentitud tambien puede deverse a que tiipo de tablas este utlizando, si esta utlizand tablas MyISAM o InnoDb, En la primera son mas rapidas pero la segunda la busqueda se hace mas lenta. Otra factor que afecta es la longitud que tiene definido en los campos, cuando la logitud de los campos es correctamente definido, el motor hace la busqueda mas rapido.

Otro aspecto del que me di cuenta, es que en el campo where, el realiza una comparacion con un campo que es texto, por lo cual debio haber unido correctamente como indicas, mediante una tabla que contenga tales valores, y que cuando se realiza la busqueda, solo la realice bajo indices y no comparando texto.
  #6 (permalink)  
Antiguo 25/05/2013, 12:07
 
Fecha de Ingreso: abril-2012
Mensajes: 124
Antigüedad: 12 años
Puntos: 3
Respuesta: Consulta de tablas relacionadas

Muchas gracias a todos por las respuestas, al final he encontrado una solución más rápida.

En realidad no tenía que buscar las personas según su ciudad, sino según su código postal. Puse una tabla con las ciudades y códigos postales separada de la de los usuarios, dónde ya no se indica la ciudad sinó el código postal de cada uno. Supongo que así, al ser un campo más corto y de tamaño fijo, la búsqueda es más rápida.
  #7 (permalink)  
Antiguo 25/05/2013, 13:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta de tablas relacionadas

el problema es de índices. Seguramente el campo de código postal lo tienes indexado, mientras que el de ciudad no.

Etiquetas: join, registros, relacionadas, select, sql, tabla, tablas
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 10:44.