mysql空間索引

2021-10-01 07:43:18 字數 3756 閱讀 4421

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...