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)
В будущих выпусках пространственные индексы могут также использоваться для оптимизации других функций.
4.7. MySQL: согласованность и совместимость
MySQL еще не выполняет следующие свойства GIS:
Дополнительные просмотры метаданных.
Спецификация OpenGIS предлагает несколько дополнительных просмотров метаданных. Например, просмотр системы GEOMETRY_COLUMNS содержит описание столбцов геометрии, одна строка для каждого столбца геометрии в базе данных.
Функция OpenGIS Length() на LineString и MultiLineString в настоящее время должна быть вызвана в MySQL как GLength()
Проблема в том, что имеется существующая SQL-функция Length(), которая вычисляет длину строковых значений, и иногда невозможно различить, вызвана ли функция в текстовом или пространственном контексте. Это будет со временем как-то решаться.
Глава 5. Сохраненные процедуры и функции
Сохраненные подпрограммы (процедуры и функции) обеспечиваются в MySQL 5.0. Сохраненная процедура представляет собой набор инструкций SQL, которые могут быть сохранены на сервере. Если это было выполнено, клиентура не должна хранить индивидуальные инструкции, а может обратиться к сохраненной процедуре.
Некоторые ситуации, где сохраненные подпрограммы могут быть особенно полезны:
Когда много прикладных программ написано на различных языках или работают на различных платформах, но должны выполнить те же самые операции с базой данных.
Когда защита первостепенна. Банки, например, используют сохраненные процедуры и функции для всех общих операций. Это обеспечивает непротиворечивую и безопасную среду, и подпрограммы могут гарантировать, что каждая операция правильно регистрируется. В такой установке прикладные программы (и их пользователи!) не имеют никакого доступа к таблицам базы данных непосредственно, а могут только выполнять специфические сохраненные подпрограммы. То есть, при всем желании, не смогут приписать лишний ноль…
Сохраненные подпрограммы могут обеспечивать улучшенную эффективность, потому что меньшее количество информации должно быть переслано между клиентом и сервером. Правда это увеличивает