Операции поиска в не пространстве нных базах данных можно оптимизировать, используя индексы. Такой способ подходит также и для пространственных баз данных. Благодаря большому разнообразию уже разработанных методов многомерной индексации, появилась возможность оптимизировать пространственный поиск.
Наиболее типичными из них являются:
- Запросы точки, которые выполняют поиск всех объектов, содержащих данную
точку. - Запросы области, которые выполняют поиск всех объектов, находящихся в дан-
ной области.
Для индексации пространственных столбцов MySQL использует R-деревья с квадратичным разбиением. Построение пространственного индекса выполняется с помощью MBR геометрического объекта. Для большинства геометрий MBR — это минимальный окружающий их прямоугольник. Для горизонтальной или вертикальной ломанной кривой MBR – это прямоугольник, вырожденный в ломанную кривую, а для точки -прямоугольник, вырожденный в точку.
Создание пространственных индексов
В MySQL можно создавать пространственные индексы, используя синтаксис, подобный синтаксису для создания стандартных индексов, но расширяемый с помощью ключевого слова SPATIAL. Индексируемые на данный момент пространственные столбцы
должны быть объявлены как NOT NULL. Следующие примеры иллюстрируют способы создания пространственных индексов.
- С ПОМОЩЬЮ CREATE TABLE.
- С ПОМОЩЬЮ ALTER TABLE.
- С ПОМОЩЬЮ CREATE INDEX.
- С ПОМОЩЬЮ ALTER TABLE.
- С ПОМОЩЬЮ DROP INDEX.
mysql> CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));
mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);
mysql> CREATE SPATIAL INDEX sp_index ON geom (g); Для удаления пространственных индексов используйте ALTER TABLE или DROP INDEX.
mysql> ALTER TABLE geom DROP INDEX g;
mysql> DROP INDEX sp_index ON geom;
Для примера предположим, что таблица geom содержит более 32 000 геометрий, которые сохранены в столбце g типа GEOMETRY. Таблица также включает столбец fid типа AUTO_INCREMENT, предназначенный для хранения идентификаторов объектов.
mysql> DESCRIBE geom;
Чтобы добавить пространственный индекс по столбцу д, воспользуйтесь следующим оператором:
mysql> ALTER TABLE geom ADD SPATIAL INDEX(g); Query OK, 32376 rows affected (4.05 sec) Records: 32376 Duplicates: 0 Warnings: 0
Использование пространственного индекса
Оптимизатор проверяет, могут ли доступные пространственные индексы быть включены в поиск запросов, использующих функцию, такую как MBRContains () или MBRWithin O в конструкции WHERE. Например, нам нужно найти все находящиеся в данном прямоугольнике объекты:
mysql> SELECT fid, AsText(g) FROM geom WHERE
mysql> MBRContains(GeomFromText(‘Polygon((30000 15000,31000 15000,31000
Ы6000,30000 16000,30000 15000))’),g);
I fid I AsText(g) i
Теперь воспользуемся explain для проверки способа выполнения этого запроса (столбец вывода id был удален, поэтому выходные данные лучше размещаются на странице):
mysql> EXPLAIN SELECT fid,AsText(g) FROM geom WHERE
mysql> MBRContains(GeomFromText(‘Polygon((30000 15000,31000 15000,31000
^16000,30000 16000,30000 15000)Г) ,g) ;
Теперь проверим, что произойдет при отсутствии пространственного индекса:
mysql> EXPLAIN SELECT fid,AsText(g) FROM g IGNORE INDEX (g) WHERE mysql> MBRContains(GeomFromText(‘Polygon((30000 15000,31000 15000,31000
^16000,30000 16000,30000 15000))f),g);
Выполним оператор SELECT, игнорируя существующий пространственный индекс:
mysql> SELECT fid,AsText(g) FROM geom IGNORE INDEX (g) WHERE
mysql> MBRContains(GeomFromText(‘Polygon((30000 15000,31000 15000,31000
Ы6000,30000 16000,30000 15000))’bg);
Когда индекс не используется, время выполнения данного запроса увеличивается с 0.00 секунд до 0.46 секунды.
В следующих версиях пространственные индексы также смогут использоваться и для оптимизации других функций (см. раздел Функции для проверки пространственных отношений между геометрическими объектами
).