Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Создание пространственных индексовСодержание книги
Поиск на нашем сайте
MySQL может создавать пространственные индексы, использующие синтаксис, подобный аналогичному для создания регулярных индексов, но расширенный с ключевым словом SPATIAL. В настоящее время пространственные столбцы, которые индексированы, должны быть объявлены как NOT NULL. Следующие примеры показывают, как создавать пространственные индексы:
С CREATE TABLE:CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));
С ALTER TABLE:ALTER TABLE geom ADD SPATIAL INDEX(g);
С CREATE INDEX:CREATE SPATIAL INDEX sp_index ON geom (g);
Для таблиц MyISAM SPATIAL INDEX создает индекс R‑tree. Для других типов памяти, которые поддерживают пространственную индексацию, SPATIAL INDEX создает индекс B‑tree. B‑tree на пространственных значениях будет полезен для поисковых таблиц с точным значением, но не для диапазона. Для удаления пространственного индекса, используйте ALTER TABLE или DROP INDEX:
С ALTER TABLE:ALTER TABLE geom DROP INDEX g;
С DROP INDEX:DROP INDEX sp_index ON geom;
Пример: Предположите, что таблица geom содержит больше, чем 32000 конфигурации, которые сохранены в столбце g типа GEOMETRY. Таблица также имеет столбец AUTO_INCREMENT fid для сохранения значений объекта 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
Использование пространственного индекса
Оптимизатор исследует, могут ли доступные пространственные индексы включаться в поиск для запросов, которые используют функцию типа MBRContains() или MBRWithin() в предложении WHERE. Следующий запрос находит все объекты, которые находятся в данном прямоугольнике:mysql> SET @poly = 'Polygon((30000 15000, 31000 15000, 31000 16000, – > 30000 16000, 30000 15000))'; mysql> SELECT fid, AsText(g) FROM geom WHERE – > MBRContains(GeomFromText(@poly), g); +‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+ | fid | AsText(g) | +‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+ | 21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30 … | | 22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8, … | | 23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4, … | | 24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4, … | | 25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882. … | | 26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4, … | | 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946. … | | 1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136. … | | 2 | LINESTRING(30220.2 15122.8,3024.2 15137.8,30207.6 15136, … | | 3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,3016 … | | 4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30 … | | 5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4, … | | 6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,3024 … | | 7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8, … | | 10 | LINESTRING(30179.6 1504.8,30181 15002.8,30190.8 15003.6, … | | 11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2, … | | 13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,3011 … | | 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30 … | | 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30 … | | 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4, … | +‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+ 20 rows in set (0.00 sec)
Использование EXPLAIN показывает, каким способом этот запрос выполнен:mysql> SET @poly = 'Polygon((30000 15000, 31000 15000, – > 31000 16000, 30000 16000, 30000 15000))'; mysql> EXPLAIN SELECT fid, AsText(g) FROM geom WHERE – > MBRContains(GeomFromText(@poly), g)\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: geom type: range possible_keys: g key: g key_len: 32 ref: NULL rows: 50 Extra: Using where 1 row in set (0.00 sec)
Проверьте, что случилось бы без пространственного индекса:mysql> SET @poly = 'Polygon((30000 15000, 31000 15000, – > 31000 16000, 30000 16000, 30000 15000))'; mysql> EXPLAIN SELECT fid,AsText(g) FROM g IGNORE INDEX (g) WHERE – > MBRContains(GeomFromText(@poly), g)\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: geom type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 32376 Extra: Using where 1 row in set (0.00 sec)
Выполнение инструкции SELECT без пространственного индекса выдает тот же самый результат, но заставляет время выполнения повышаться с 0.00 до 0.46 секунды:mysql> SET @poly = 'Polygon((30000 15000, 31000 15000, – > 31000 16000, 30000 16000, 30000 15000))'; mysql> SELECT fid, AsText(g) FROM geom IGNORE INDEX (g) WHERE – > MBRContains(GeomFromText(@poly), g); +‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+ | fid | AsText(g) | +‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+ | 1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136. … | | 2 | LINESTRING(30220.2 15122.8,3024.2 15137.8,30207.6 15136, … | | 3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,3016 … | | 4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30 … | | 5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4, … | | 6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,3024 … | | 7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8, … | | 10 | LINESTRING(30179.6 1504.8,30181 15002.8,30190.8 15003.6, … | | 11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2, … | | 13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,3011 … | | 21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30 … | | 22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8, … | | 23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4, … | | 24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4, … | | 25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882. … | | 26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4, … | | 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30 … | | 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30 … | | 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4, … | | 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946. … | +‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+ 20 rows in set (0.46 sec)
В будущих выпусках пространственные индексы могут также использоваться для оптимизации других функций.
|
||
|
Последнее изменение этой страницы: 2021-01-14; просмотров: 139; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.236 (0.007 с.) |