sql語句查詢經緯度範圍

來源:互聯網
上載者:User

標籤:

 

指定一個經緯度,給定一個範圍值(單位:千米),查出在經緯度周圍這個範圍內的資料。 
經度:113.914619 
緯度:22.50128 
範圍:2km 
longitude為資料表經度欄位 
latitude為資料表緯度欄位 
SQL在mysql下測試通過,其他資料庫可能需要修改 
SQL語句如下: 

select * from location where sqrt(      (       ((113.914619-longitude)*PI()*12656*cos(((22.50128+latitude)/2)*PI()/180)/180)       *       ((113.914619-longitude)*PI()*12656*cos (((22.50128+latitude)/2)*PI()/180)/180)      )      +      (       ((22.50128-latitude)*PI()*12656/180)       *       ((22.50128-latitude)*PI()*12656/180)      )  )<2

 

MySQL效能調優 – 使用更為快速的演算法進行距離

最近遇到了一個問題,通過不斷的嘗試最終將某句原本佔據近1秒的查詢最佳化到了0.01秒,效率提高了100倍.

問題是這樣的,有一張存放使用者居住地點經緯度資訊的MySQL資料表,表結構可以簡化 為:id(int),longitude(long),latitude()long. 而業務系統中有一個功能是尋找離某個使用者最近的其餘數個使用者,通過程式碼分析,可以確定原先的做法基本是這樣的:

//需要查詢的使用者的座標

$lat=20; $lon=20;//執行查詢,算出該使用者與所有其他使用者的距離,取出最近的10個 $sql=‘select * from users_location order by ACOS(SIN((‘.$lat.‘ * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS((‘.$lat.‘ * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS((‘.$lon.‘ * 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10‘;

 

而這條sql執行的速度卻非常緩慢,用了近1秒的時間才返回結果,應該是因為order裡的子語句用了太多的數學計算公式,導致整體的運算速度下降.

而在實際的使用中,不太可能會發生需要計算該使用者與所有其他使用者的距離,然後再排序的情況,當使用者數量達到一個層級時,就可以在一個較小的範圍裡進行搜尋,而非在所有使用者中進行搜尋.

所以對於這個例子,我增加了4個where條件,只對於經度和緯度大於或小於該使用者1度(111公裡)範圍內的使用者進行距離計算,同時對資料表中的經度和緯度兩個列增加了索引來最佳化where語句執行時的速度.

最終的sql語句如下

$sql=‘select * from users_location where latitude > ‘.$lat.‘-1 and latitude < ‘.$lat.‘+1 and longitude > ‘.$lon.‘-1 and longitude < ‘.$lon.‘+1 order by ACOS(SIN((‘.$lat.‘ * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS((‘.$lat.‘ * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS((‘.$lon.‘* 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10‘;

經過最佳化的sql大大提高了運行速度,在某些情況下甚至有100倍的提升.這種從業務角度出發,縮小sql查詢範圍的方法也可以適用在其他地方.

 

轉自:http://cancait.blog.163.com/blog/static/21335744201381401721826/

http://www.cnblogs.com/tyjsjl/p/3799439.html

 

sql語句查詢經緯度範圍

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.