11.4.9 创建空间索引

对于InnoDBMyISAMtable,MySQL 可以使用类似于创建常规索引的语法创建空间索引,但是使用SPATIAL关键字。空间索引中的列必须声明为NOT NULL。下面的示例演示如何创建空间索引:

CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));
CREATE TABLE geom (g GEOMETRY NOT NULL);
ALTER TABLE geom ADD SPATIAL INDEX(g);
CREATE TABLE geom (g GEOMETRY NOT NULL);
CREATE SPATIAL INDEX g ON geom (g);

SPATIAL INDEX创建 R 树索引。对于支持空间列的非空间索引的存储引擎,该引擎将创建 B 树索引。空间值的 B 树索引可用于精确值查找,但不适用于范围扫描。

有关为空间列构建索引的更多信息,请参见第 13.1.14 节“ CREATE INDEX 语句”

要删除空间索引,请使用ALTER TABLEDROP INDEX

ALTER TABLE geom DROP INDEX g;
DROP INDEX g ON geom;

示例:假设 tablegeom包含 32,000 多个几何,这些几何存储在GEOMETRY类型的g列中。该 table 还具有AUTO_INCREMENTfid,用于存储对象 ID 值。

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

mysql> SELECT COUNT(*) FROM geom;
+----------+
| count(*) |
+----------+
|    32376 |
+----------+
1 row in set (0.00 sec)

要在列g上添加空间索引,请使用以下语句:

mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);
Query OK, 32376 rows affected (4.05 sec)
Records: 32376  Duplicates: 0  Warnings: 0