Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 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; просмотров: 81; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.216.190.167 (0.011 с.) |