思路就是一,怎麼使用索引,如何縮小範圍
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?有沒有減少檔案排序?語句的掃瞄行數減少了多少?沒有大量...