- MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型,MySQL在空间索引这方年遵循OpenGIS几何数据模型规则。
- 从 MySQL 8.0.12 开始,空间索引不允许使用 ASC 和 DESC
- 对于InnoDB和MyISAM表,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 限制的列上定义的空间索引。