2017-03-06 60 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