mysql查詢附近優化思路

2021-07-25 06:58:42 字數 1684 閱讀 2245

思路就是一,怎麼使用索引,如何縮小範圍

1.按照地區進行縮小範圍

例如中國,就比全球要小,北京又比中國要小,甚至精確到某個區,縣等

2.通過geohash演算法,建立索引

其實就是通過一種編碼方式,將二維的經緯度轉換為一維的,類似於那將整個地球劃分成4000 * 4000,每個格仔再劃分成10 * 10,最終的粒度是1公里*1公里,這樣,我們就可以對這個一維的資料建立索引進行查詢,網上搜尋一下很多這方面的知識,這裡不細說,參考geohash核心原理解析

方法一: 座標轉換法

考驗自己的數學啊,我是自己推了好久

設有兩點a b ,座標分別為 (lat1,lng1) (lat2,lng2),地球中心點為o,地球半徑為r=3979

假如b點是資料庫中存好的,a點是根據使用者所在地取出來的,那麼,網上最常見的計算距離的方法如下,(下面方程高中內容,不再證明)

ab弧度=3979

*△aob=3979

*arccos(cos△aob)=

3979arccos

我們對大括號裡面的進行分解,得到:

cos(lat1)cos(lat2)cos(lng2-lng1)+sin(lat1)sin(lat2)=

cos(lat1)cas(lng1)*cos(lat2)cos(lng2)+cos(lat1)sin(lng1)cos(lat2)sin(lng2)+sin(lat1)sin(lat2)

注意我標記的部分,此時,我們可以對資料庫加三列,把經緯度座標這兩列給去掉,資料庫儲存的是經過下面的公式計算過的

x=cos(lat)cos(lng)

y=cos(lat2)sin(lng2)

z=sin(lat2)

那麼這兩點的距離就是

3979arccos(x1*x2+y1*y2+z1*z2)
對於arccos函式在-1到1單調遞減

arccos的函式,-1到1是單調遞減函式,在最下面有附錄:

其實也很顯然aob的角度越小兩點距離越近

假如我們的需求是只需要取前20個最近的post。所以,我們只需要找出 x1*x2+y1*y2+z1*z2,這種計算對於資料庫中cpu的占用是非常小的,我查出最大的20個值即可

然後再去程式中,計算3979*arc(取出的20個值)。程式中只需計算20次arc的函式,是非常快的

這裡不再需要使用估算,不再使用sqrt,資料庫中只是計算乘法,經過一些措施減少查詢的條數,這種查詢佔cpu是非常少的

根據某些特點區域的經緯度,我們知道每一經度大概的距離,每一緯度大概的距離,然後,地球上兩點,就可看成平面,勾股定理就可以了。在特點場合,這種效率很高,準確率也還可以,甚至,我們可以直接經度上的距離,加上緯度上的距離,這樣不是非常準確,對於不是非常高準確率要求的,我們可以直接做

例如我們可以用三階去方程擬合cos,沒一緯度110公里,每一經度110公里*cos緯度

如何擬合參考:

直接對整個地球(或者你業務所在的某個區域)進行區域的劃分,每乙個區域指向一些你要查詢的經緯度的點,我們都可以建立索引,使用者一處於這個區域,就把這個區域的所有點給取出來,這種方法的優點是快,缺點是前期需要做很大的處理工作,其實這類似與geohash

mysql思路 MySQL優化思路

通過指令碼,重新整理觀察mysql的status,觀察是否有週期性故障活波動,一般由訪問高峰或者快取失效引起,家快取並更改快取失效策略,是失效時間分散或頁面定時失,show processlist顯示哪些執行緒正在執行。您也可以使用mysqladmin processlist語句得到此資訊。如果您有...

mysql優化思路

調優思路 1.資料庫設計與規劃 以後再修該很麻煩,估計資料量,使用什麼儲存引擎 2.資料的應用 怎樣取資料,sql語句的優化 3.mysql服務優化 記憶體的使用,磁碟的使用 4.作業系統的優化 核心 tcp連線數量 5.公升級硬體裝置 磁碟io規劃 raid技術 raid0 xfs swap分割槽...

mysql優化思路

為什麼別人問你mysql優化的知識 總是沒有底氣,因為你只是回答一些大而化之的調優原則,比如 1 建立合理索引 什麼樣的索引合理?2 分表分庫 用什麼策略分表分庫?3 主從分離 用什麼中介軟體?並沒有從細化到定量的層面去分析.如qps提高了 n?有沒有減少檔案排序?語句的掃瞄行數減少了多少?沒有大量...