空间索引(SPATIAL)

Exisi 2023-03-29 11:04:12
Categories: Tags:
  • MySQL5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型,MySQL在空间索引这方年遵循OpenGIS几何数据模型规则。

 

  • MySQL 8.0.12 开始,空间索引不允许使用 ASC DESC

 

  • 对于InnoDBMyISAM表,MySQL可以使用类似于创建常规索引的语法创建空间索引,但使用spatial关键字。空间索引中的列必须声明为NOT NULL

 

  • 以下示例演示了如何创建空间索引:

示例

CREATE TABLE geom (

g GEOMETRY NOT NULL SRID 4326,

SPATIAL INDEX(g)

);

示例

CREATE TABLE geom (

g GEOMETRY NOT NULL SRID 4326

);

ALTER TABLE geom

ADD SPATIAL INDEX(g);

示例

CREATE TABLE geom (

g GEOMETRY NOT NULL SRID 4326

);
CREATE SPATIAL INDEX g

ON geom (g);

 

  • 假设一张表geom包含32000多个几何图形,存储在GEOMETRY类型的g列中。该表还有一个用于存储对象 ID 值的 AUTO_INCREMENT fid

示例

DESCRIBE geom;
+-------+------------+------+------+----------+-------------------+
| Field | Type  
     | Null  | Key  | Default | Extra                 |
+-------+------------+------+------+----------+-------------------+
| fid  
 | int(11)      |         | PRI  | NULL    | auto_increment  |
| g    
  | geometry |         |        |              |                            |
+-------+------------+------+------+----------+-------------------+
2 rows in set (0.00 sec)

 

SELECT COUNT(*) FROM geom;

 

运行结果如下:

+-----------+
| count(*)
 |
+-----------+
|    32376 |
+-----------+
1 row in set (0.00 sec)

  • SPATIAL INDEX 创建 R 树索引。对于支持空间列的非空间索引的存储引擎,引擎会创建 B 树索引。空间值的 B 树索引对精确值查找很有用,但对范围扫描没有用。

 

  • 优化器可以使用在受 SRID 限制的列上定义的空间索引。