### 11.4.10 创建空间索引 为了`InnoDB`和`MyISAM`表,MySQL 可以使用类似于创建常规索引的语法创建空间索引,但使用`空间`关键词。必须声明空间索引中的列`非空`.以下示例演示了如何创建空间索引: - 和[`创建表`](create-table.html): ``` CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326, SPATIAL INDEX(g)); ``` - 和[`更改表`](alter-table.html): ``` CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326); ALTER TABLE geom ADD SPATIAL INDEX(g); ``` - 和[`创建索引`](create-index.html): ``` CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326); CREATE SPATIAL INDEX g ON geom (g); ``` `空间索引`创建一个 R-tree 索引。对于支持空间列的非空间索引的存储引擎,引擎会创建 B 树索引。空间值的 B-tree 索引对于精确值查找很有用,但对于范围扫描无效。 优化器可以使用在受 SRID 限制的列上定义的空间索引。有关详细信息,请参阅[第 11.4.1 节,“空间数据类型”](spatial-type-overview.html), 和[第 8.3.3 节,“空间索引优化”](spatial-index-optimization.html). 有关索引空间列的更多信息,请参阅[第 13.1.15 节,“CREATE INDEX 语句”](create-index.html). 要删除空间索引,请使用[`更改表`](alter-table.html)要么[`删除索引`](drop-index.html): - 和[`更改表`](alter-table.html): ``` ALTER TABLE geom DROP INDEX g; ``` - 和[`删除索引`](drop-index.html): ``` DROP INDEX g ON geom; ``` 示例:假设一个表`几何`包含超过 32,000 个几何图形,存储在列中`g`类型`几何学`.该表还有一个`自动递增`柱子`菲德`用于存储对象 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 ```