11.4.9 Создание пространственных индексов
Для таблиц InnoDB и MyISAM MySQL может создавать пространственные индексы, используя синтаксис, аналогичный созданию обычных индексов, но с использованием ключевого слова SPATIAL. Столбцы в пространственных индексах должны быть объявлены NOT NULL. Следующие примеры демонстрируют, как создавать пространственные индексы:
-
С помощью
CREATE TABLE:CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));
-
С помощью
ALTER TABLE:CREATE TABLE geom (g GEOMETRY NOT NULL); ALTER TABLE geom ADD SPATIAL INDEX(g);
-
С помощью
CREATE INDEX:CREATE TABLE geom (g GEOMETRY NOT NULL); CREATE SPATIAL INDEX g ON geom (g);
SPATIAL INDEX создаёт индекс R-дерева. Для движков хранилища, поддерживающих не пространственное индексирование пространственных столбцов, движок создаёт индекс B-дерева. Индекс B-дерева на пространственных значениях полезен для поиска точных значений, но не для сканирования диапазонов.
Дополнительную информацию об индексировании пространственных столбцов см. в Разделе 13.1.14, «CREATE INDEX Statement».
Для удаления пространственных индексов используйте ALTER
TABLE или DROP INDEX:
-
С помощью
ALTER TABLE:ALTER TABLE geom DROP INDEX g;
-
С помощью
DROP INDEX:DROP INDEX g ON geom;
Пример: Предположим, что таблица geom содержит более 32 000 геометрий, которые хранятся в столбце g типа GEOMETRY. Таблица также имеет столбец AUTO_INCREMENT fid для хранения значений идентификаторов объектов.
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
© 2025 Oracle
Licensed under the GPLv2 License.