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*** 多个同类型对象的集合 群岛(多面)、公交站点群(多点)
相关推荐
java_logo1 分钟前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
广州灵眸科技有限公司7 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒10 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手10 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学10 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh12 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562413 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD13 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo13 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程