r树索引、mysql对r树的支持

文章目录

mysql本身并不支持r树索引,但是支持空间索引,底层就是r树。

注意经纬度的顺序,维度在前,经度在后,当然也可以指定。

案例

建表

sql 复制代码
CREATE TABLE shops (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    -- 使用 POINT 空间类型存储经纬度,并指定 SRID 4326(WGS84标准坐标系)
    location POINT NOT NULL,
    -- 创建空间索引(底层就是 R树索引)
    SPATIAL INDEX(location)
) ENGINE=InnoDB;

注:point类型从dbeaver界面新增是找不到的,就用sql新增吧。

插入数据

sql 复制代码
INSERT INTO shops (id, name, location) VALUES
(1, '天安门纪念品店', ST_GeomFromText('POINT(39.909 116.397)', 4326)),
(2, '故宫咖啡厅', ST_GeomFromText('POINT(39.915 116.390)', 4326)),
(3, '王府井百货', ST_GeomFromText('POINT(39.911 116.410)', 4326)),
(4, '西单大悦城', ST_GeomFromText('POINT(39.910 116.373)', 4326));

查询

基础查询:查看刚才插入的数据

因为空间数据在 MySQL 内部是二进制存储的,直接 SELECT 会看不懂,所以需要用 ST_AsText 函数把它转回我们能看懂的文本格式。

sql 复制代码
SELECT 
    id, 
    name, 
    ST_AsText(location) AS location_text 
FROM shops;
范围查询:找出某个矩形区域内的店铺

假设我们要框选北京二环内的一小块区域,看看这里面有哪些店。我们可以用 MBRContains 函数,它会利用 R树索引,快速找出落在指定"最小包围矩形(MBR)"内的点:

sql 复制代码
SELECT 
    name, 
    ST_AsText(location) 
FROM shops 
WHERE MBRContains(
    -- 坐标顺序改为:纬度在前,经度在后 (左下 -> 右下 -> 右上 -> 左上 -> 回到左下)
    ST_GeomFromText('POLYGON((39.90 116.38, 39.90 116.40, 39.92 116.40, 39.92 116.38, 39.90 116.38))', 4326), 
    location
);
进阶查询:查找离我最近的店铺(KNN 最近邻搜索)
sql 复制代码
SELECT 
    name, 
    -- 计算球面距离,结果单位是米
    ST_Distance_Sphere(location, ST_GeomFromText('POINT(39.903 116.428)', 4326)) AS distance_in_meters
FROM shops
ORDER BY location <=> ST_GeomFromText('POINT(39.903 116.428)', 4326)
LIMIT 2;

常用空间类型

上述案例用的point,但是point并不是唯一的空间索引,常见的如下:

类型 含义 典型应用场景
POINT 单个坐标点 门店位置、打车起点/终点
LINESTRING 连续的线段 道路、河流、运动轨迹
POLYGON 封闭的多边形区域 行政区划、商圈、园区范围
MULTI*** 多个同类型对象的集合 群岛(多面)、公交站点群(多点)
相关推荐
Bioinfo Guy2 小时前
高分Panel复现系列|转录因子网络太乱?用模块框把重点圈出来
数据库·生物信息学·生信可视化
ltl4 小时前
Disaggregated DB 合集:Socrates、PolarDB、Taurus 的共同模式
数据库
Blossom i6 小时前
大数据预处理与采集实验一:使用Python操作MySQL数据库
数据库·mysql
InfinitePlus6 小时前
Docker MySQL搭建一主一从
mysql·docker
雾时之林7 小时前
Linux--软件管理、源码包安装
linux·服务器·数据库
老纪的技术唠嗑局8 小时前
超级干货分享:中小企业使用 OceanBase 实践经验汇总
数据库
坐吃山猪9 小时前
Docker07-MySQL
mysql·docker·容器
CLOUD ACE9 小时前
谷歌云代理|零售商Target 如何利用 Spanner Graph 提升零售发现体验并将数据库维护成本降低 50%
数据库·零售
AI大模型-小雄9 小时前
Codex写分页接口为什么越翻越慢?用Cursor Pagination解决重复与漏数据
大数据·数据库·elasticsearch·搜索引擎·chatgpt·后端开发·codex
少晓年9 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql