2017-03-06 86 views
1

我想在我的数据库中搜索距离经纬度最近的城市&范围。要做到这一点,我使用这个查询:
优化内部加入SQL查询

SELECT ville_nom_reel FROM inspitravel.villes_france_free 
WHERE ville_latitude_deg BETWEEN 48.0462165495 AND 48.9471174505 
AND ville_longitude_deg BETWEEN -0.45045045045 AND 0.45045045045 

该查询在0.0123秒执行。

现在我想在另一个数据库中搜索并从第一个查询中检索ville_nom_reel字段中的5个字段。要做到这一点,我用INNER JOIN:

SELECT villes_france_free.ville_nom_reel, villes_booking.full_name, villes_booking.number_of_hotels, villes_booking.deeplink FROM inspitravel.villes_france_free 
INNER JOIN inspitravel.villes_booking ON villes_france_free.ville_nom_reel = villes_booking.full_name 
WHERE ville_latitude_deg BETWEEN 48.0462165495 AND 48.9471174505 
AND ville_longitude_deg BETWEEN -0.45045045045 AND 0.45045045045 
AND ville_population_2012 > 3000 Limit 1 

现在这个查询在4秒内执行...
我如何优化呢? 谢谢。

+1

开始时不要使用*,但只声明你想要的5个字段 – apomene

+4

你有关于on子句中涉及的列的索引吗?和ville_population_2012? – scaisEdge

+0

你可以请添加表结构(哪些列是哪种类型)。 – Olli

回答

0

你可以尝试暗示lat/long应该先评估?也许:

SELECT * 
FROM (
     SELECT * 
     FROM inspitravel.villes_france_free 
     WHERE ville_latitude_deg BETWEEN 48.0462165495 AND 48.9471174505 
       AND ville_longitude_deg BETWEEN -0.45045045045 AND 0.45045045045 
     ) villes 
JOIN inspitravel.villes_booking 
ON  villes.ville_nom_reel = villes_booking.full_name 
WHERE ville_population_2012 > 3000 
LIMIT 1 
+0

它返回空结果! –

+0

你是对的,将限制1移到内部查询中是不正确的!很高兴索引建议帮助 – Andomar

0

谢谢你的帮助。
第一个我删除了*所有我需要的字段名称。感谢@apomene

SELECT villes_france_free.ville_nom_reel, villes_booking.full_name, villes_booking.number_of_hotels, villes_booking.deeplink FROM inspitravel.villes_france_free 
INNER JOIN inspitravel.villes_booking ON villes_france_free.ville_nom_reel = villes_booking.full_name 
WHERE ville_latitude_deg BETWEEN 48.0462165495 AND 48.9471174505 
AND ville_longitude_deg BETWEEN -0.45045045045 AND 0.45045045045 
AND ville_population_2012 > 3000 Limit 1 

然后,就像你说的,我必须参与有关条款索引列。
谢谢@scaisEdge 现在这个查询在0.100秒内执行!完善。

+0

您每张表获得一个索引,因此您可以在(lat,lon)上添加一个覆盖索引, – Strawberry