基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建空间索引
更新时间:2026-07-15 20:42:47
OceanBase 数据库支持创建常规索引的语法创建空间索引,但使用 SPATIAL 关键字。空间索引中的列必须声明为 NOT NULL。支持在存储(STORED)生成列上创建空间索引,不支持在虚拟(VIRTUAL)生成列上创建。
注意事项
- 创建空间索引的列定义中必须包含
NOT NULL约束。 - 创建了空间索引的列需要已经定义 SRID,否则在该列上建的空间索引在查询时无法生效。
- 如果是在 STORED 生成列上创建空间索引,则创建列时 DDL 必须显式指定
STORED关键字。如果在创建生成列的时候没有指定VIRTUAL或者STORED关键字,那么默认创建 VIRTUAL 生成列。 - 在创建了索引之后,比较的时候使用列定义中的 SRID 所对应的坐标系。空间索引存储了几何对象的 MBR(Minimum Bounding Rectangle)构建,MBR 的比较方式也依赖于 SRID。
准备工作
使用 GIS 功能前,需在业务租户配置 GIS meta 数据。在连接到服务器后,执行如下命令将 default_srs_data_mysql.sql 文件导入到数据库中:
注意
仅支持在 SYS 租户下执行该导入命令,该命令执行时会将数据写入到主租户,并且会同步到备租户中。
-- module 表示待导入的模块。
-- tenant 表示待导入的租户。
-- infile 表示待导入 sql 文件的相对路径。
ALTER SYSTEM LOAD MODULE DATA module=gis tenant=mysql infile = 'etc/default_srs_data_mysql.sql';
语句语法具体说明请参见 LOAD MODULE DATA。
返回以下结果代表导入数据文件成功:
Query OK, 0 rows affected
示例
创建空间索引
以下示例展示如何在常规列上创建空间索引:
- 使用
CREATE TABLE:
CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326, SPATIAL INDEX(g));
- 使用
ALTER TABLE:
CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326);
ALTER TABLE geom ADD SPATIAL INDEX(g);
- 使用
CREATE INDEX:
CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326);
CREATE SPATIAL INDEX g ON geom (g);
以下示例展示如何删除空间索引:
- 使用
ALTER TABLE:
ALTER TABLE geom DROP INDEX g;
- 使用
DROP INDEX:
DROP INDEX g ON geom;
在生成列上创建空间索引
生成列是数据库表中的一种特殊列,详细信息请参见生成列操作。
以下示例展示如何在 STORED 生成列上创建空间索引:
- 在 linestring 类型的生成列上创建空间索引,其他
POINT/POLYGON/ | MULTIPOINT/MULTILINESTRING/ | MULTIPOLYGON类型均支持:
CREATE TABLE `receivable_items` (
`from_unit` int NOT NULL,
`to_unit` int NOT NULL,
`unit_range` linestring GENERATED ALWAYS AS (linestring(point(-(1),`from_unit`), point(1,`to_unit`))) STORED NOT NULL srid 0,
SPATIAL KEY `idx_unit_range` (`unit_range`)
);
- 在 geometry 类型的生成列上创建空间索引:
CREATE TABLE `receivable_items` (
`id` int(32) NOT NULL auto_increment,
`geo_text` varchar(1024) NOT NULL,
`unit_range` geometry GENERATED ALWAYS AS (st_geomfromtext(geo_text, 4326, 'axis-order=long-lat')) STORED NOT NULL srid 4326
);
- 不支持在 VIRTUAL 生成列上创建空间索引,创建语句会报错:
CREATE TABLE `receivable_items` (
`id` int(32) NOT NULL auto_increment,
`geo_text` varchar(1024) NOT NULL,
`unit_range` geometry GENERATED ALWAYS AS (st_geomfromtext(geo_text, 4326, 'axis-order=long-lat')) NOT NULL srid 4326,
SPATIAL KEY `idx_unit_range` (`unit_range`)
);
ERROR 3106 (HY000): 'unit_range' is not supported for generated columns.
- 支持后建索引:
CREATE TABLE `receivable_items` (
`id` int(32) NOT NULL auto_increment,
`geo_text` varchar(1024) NOT NULL,
`unit_range` geometry GENERATED ALWAYS AS (st_geomfromtext(geo_text, 4326, 'axis-order=long-lat')) STORED NOT NULL srid 4326
);
INSERT INTO receivable_items(geo_text) VALUES('point(120.34904267189361 30.320965261625222)');
INSERT INTO receivable_items(geo_text) VALUES('point(120.34904267189360 30.320965261625222)');
CREATE SPATIAL INDEX IF NOT EXISTS `idx_unit_range` ON `receivable_items` (`unit_range`);
- 支持分区表场景:
CREATE TABLE `receivable_items` (
`id` int(32) NOT NULL auto_increment primary key,
`geo_text` varchar(1024) NOT NULL,
`unit_range` geometry GENERATED ALWAYS AS (st_geomfromtext(geo_text, 4326, 'axis-order=long-lat')) STORED NOT NULL srid 4326,
SPATIAL KEY `idx_unit_range` (`unit_range`)
) PARTITION BY hash(id) PARTITIONS 3;