Поиск

Оптимизация пространственного анализа

Операции поиска в не пространстве нных базах данных можно оптимизировать, ис­пользуя индексы. Такой способ подходит также и для пространственных баз данных. Благодаря большому разнообразию уже разработанных методов многомерной индекса­ции, появилась возможность оптимизировать пространственный поиск.
Наиболее типичными из них являются:

  1. Запросы точки, которые выполняют поиск всех объектов, содержащих данную
    точку.
  2. Запросы области, которые выполняют поиск всех объектов, находящихся в дан-
    ной области.

Для индексации пространственных столбцов MySQL использует R-деревья с квад­ратичным разбиением. Построение пространственного индекса выполняется с помо­щью MBR геометрического объекта. Для большинства геометрий MBR — это минималь­ный окружающий их прямоугольник. Для горизонтальной или вертикальной ломанной кривой MBR - это прямоугольник, вырожденный в ломанную кривую, а для точки -прямоугольник, вырожденный в точку.

Создание пространственных индексов
В MySQL можно создавать пространственные индексы, используя синтаксис, подоб­ный синтаксису для создания стандартных индексов, но расширяемый с помощью клю­чевого слова SPATIAL. Индексируемые на данный момент пространственные столбцы должны быть объявлены как NOT NULL. Следующие примеры иллюстрируют способы создания пространственных индексов.
  • С ПОМОЩЬЮ CREATE TABLE.
  • mysql> CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));
  • С ПОМОЩЬЮ ALTER TABLE.
  • mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);
  • С ПОМОЩЬЮ CREATE INDEX.
  • mysql> CREATE SPATIAL INDEX sp_index ON geom (g); Для удаления пространственных индексов используйте ALTER TABLE или DROP INDEX.
  • С ПОМОЩЬЮ ALTER TABLE.
  • mysql> ALTER TABLE geom DROP INDEX g;
  • С ПОМОЩЬЮ DROP INDEX.
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 секунды.
В следующих версиях пространственные индексы также смогут использоваться и для оптимизации других функций (см. раздел Функции для проверки пространственных отношений между геометрическими объектами ).