create
table
`shop_info`
(`id`
int(11)
notnull
auto_increment
comment
'id'
,`shop_name`
varchar(64
)not
null
comment
'門店名稱'
,`geom_point`
geometry
notnull
comment
'經緯度'
,primary
key(
`id`),
spatial key
`geom_index`
(`geom_point`))
engine
=innodb
default
charset
=utf8mb4;
初始化500萬條測試資料:
如果知道兩個點的緯度和經度,則可以計算它們之間的距離。計算該距離的最簡單方法是假設地球是乙個完美的球體。但實際上地球是乙個兩極稍扁、赤道略鼓的不規則球體,因此許多情況下僅僅是計算乙個合理的近似值。
1個緯度 ≈ 69英里(111km),與經度無關
在緯度 = 0的赤道處,1度經度 ≈ 69英里(111km),但這隨緯度而變化:
緯度±10,1度經度 = 68英里(109km)
緯度±20,1度經度 = 65英里(104km)
緯度±30,1度經度 = 60英里(96km)
緯度±40,1度經度 = 53英里(85km)
緯度±50,1度經度 = 44英里(71km)
緯度±60,1度經度 = 35英里(56km)
緯度±70,1度經度 = 24英里(38km)
緯度±80,1度經度 = 12英里(19km)
緯度±90,1度經度 = 0英里(0km)
執行sql獲取附近2km以內的記錄。
粗精度為了指定位置周圍建立邊界矩形(以便可以利用其上的空間索引),可以使用經度和緯度之間的平均距離111公里。每緯度近似111km,而每經度則超過111km。因此建立出來的邊界矩形會比實際需求的邊界大。
-- 東經121.5
set@longitude
=121.5
;-- 北緯31.5
set@latitude
=31.5
;-- 2km範圍內
set@distance
=2000
;select id, x(geom_point) longitude, y(geom_point) latitude, st_distance_sphere(
point
(@longitude
,@latitude
), geom_point)
as distance
from shop_info
where mbrcontains(st_makeenvelope(
point((
@longitude+(
@distance
/1000
/111))
,(@latitude+(
@distance
/1000
/111))
),point((
@longitude-(
@distance
/1000
/111))
,(@latitude-(
@distance
/1000
/111))
)), geom_point)
order
by distance limit
10;
細精度
如果需要邊界矩形更精確,則可以使用cos(radians($)) * 111
進行經度計算。示例sql如下:
-- 東經121.5
set@longitude
=121.5
;-- 北緯31.5
set@latitude
=31.5
;-- 2km範圍內
set@distance
=2000
;select id, x(geom_point) longitude, y(geom_point) latitude, st_distance_sphere(
point
(@longitude
,@latitude
), geom_point)
as distance
from shop_info
where mbrcontains(st_makeenvelope(
point((
@longitude+(
@distance
/1000
/111
*cos(radians(
@latitude))
)),(
@latitude+(
@distance
/1000
/111))
),point((
@longitude-(
@distance
/1000
/111
*cos(radians(
@latitude))
)),(
@latitude-(
@distance
/1000
/111))
)), geom_point)
order
by distance limit
10;
注:st_makeenvelope和st_distance_sphere從mysql 5.7.6版本開始支援,st_distance_sphere
返回的單位為公尺。 mysql空間索引關鍵字 MySQL
19.6.1.建立空間索引 mysql能夠使用與建立正規索引類似的語法建立空間索引,但使用了spatial關鍵字進行了擴充套件。對於目前編制了索引的空間列,必須將其宣告為not null。在下面的示例中,介紹了建立空間索引的方法。對於create table mysql create table g...
空間索引 網格索引
第一篇講到了傳統的索引如b樹不能很好的支援空間資料,比如點 poi等 線 道路 河流等 面 行政邊界 住宅區等 本篇將對空間索引進行簡單分類,然後介紹網格索引。深入淺出空間索引1 一 空間索引有哪幾種?傳統索引使用雜湊和樹這兩類最基本的資料結構。空間索引雖然更為複雜,但仍然發展於這兩種資料結構。因此...
Mysql的索引空間重用 資料庫索引原理
先看個例子 在下面這個表t中,如果我執行 select from t where k between3and5,需要執行幾次樹的搜尋操作,會掃瞄多少行?mysql create table t id int primary key,k int not null default 0,s varchar...