Problema con tiempo de una consulta SQL
Hola a todos,
estoy realizando una consulta sobre dos tablas de una base de datos: una con una lista de empresas y otra con una lista de todos los municipios de España.
En la tabla de las empresas, guardo el id del municipio al que pertenece y en la tabla de municipios tengo el campo con el nombre del municipio junto con esa id.
Hasta ahí todo normal. El tema es que quiero recuperar el nombre de los municipios y su id en los que haya empresas registradas en nuestra base de datos. Como es lógico hay localidades en las que coinciden un montón de empresas por lo que escribí la siguiente consulta:
SELECT DISTINCT `asociados`.`municipio` AS `id_municipio` , (
SELECT `municipios`.`municipio`
FROM `municipios`
WHERE `municipios`.`id_municipio` = `asociados`.`municipio`
) AS `municipio`
FROM `asociados` , `municipios`
ORDER BY `municipio` ASC
Pues bien, esa consulta tarda en nuestro servidor 2,5 segundos +/- en ejecutarse por lo que es inviable usarla pues se realizan muchísimas consultas igual que esta.
¿Alguien sabe si hay alguna forma más "óptima" de hacerlo? Esta está claro que no lo es...
Gracias!
Isma
La clave son las agrupaciones (GROUP BY). En este caso agrupar por empresas y luego mostrarlas con sus correspondientes municipios. Normalmente si tardan tanto, es porque recuperas datos innecesario o simplemente, está mal. Aún así es bastante raro que una simple consulta con anidada te tarde tanto, boh! Los DISTINCT parece mentira pero también cargan.
dagi3d
lo que no entiendo es por qué haces dos consultas pudiendo hacer una sola con un join...
dL
dagi3d
Tienes razón. La verdad es que no tengo mucha idea de SQL con lo que cualquier cosita me supera. Al final lo dejé de la siguiente forma:
SELECT DISTINCT `asociados`.`municipio` AS `id` , `municipios`.`municipio`
FROM `asociados` , `municipios`
WHERE `asociados`.`municipio` = `municipios`.`id_municipio`
ORDER BY `municipios`.`municipio` ASC
Muchas gracias a ambos!
dagi3d
ah vale, que era simplemente que no lo conocías. tranquilo, a mi me pasó lo mismo cuando empecé a tocar sql
¿te va mejor la consulta ahora? mira también que tengas indexados los campos que utilizas para las foreign keys ya que te puede aligerar bastante los tiempos de respuesta en según que casos
luego un consejillo, intenta seguir algunas convenciones a la hora de nombrar las columnas. yo te recomiendo que la clave principal se llame siempre 'id', independientemente del nombre de la tabla, y luego, las foreign keys, como id_[nombre_tabla] (o [nombre_tabla]_id)
dL
Si, son todo índices. Ahora tarda del orden de 0,0002 segundos.
Gracias! Con gente como tu da gusto!!!