Зависит ли производительность индексов пространственной геометрии от размера и плотности геометрических фигур?
Пространственные индексы
Учитывая пространственный индекс, это утилита индекса, то есть общая производительность индекса, только такая же хорошая, как и общая геометрия.
Например, если бы я взял миллион типов данных геометрии и вставил их в таблицу так, чтобы их относительные точки были плотно расположены друг к другу, это заставило бы этот индекс работать лучше для идентичных геометрических фигур, относительное расположение которых могло бы быть значительно более разреженным,
Вопрос 1
Например, возьмите эти две геометрические фигуры.
Ситуация 1
LINESTRING(0 0,1 1,2 2)
LINESTRING(1 1,2 2,3 3)
Геометрически они идентичны, но их координаты смещены на одну точку. Представьте, что это повторилось миллион раз.
Теперь возьми эту ситуацию,
Ситуация 2
LINESTRING(0 0,1 1,2 2)
LINESTRING(1000000 1000000,1000001 10000001,1000002 1000002)
LINESTRING(2000000 2000000,2000001 20000001,2000002 2000002)
LINESTRING(3000000 3000000,3000001 30000001,3000002 3000002)
В приведенном выше примере:
- размеры линий идентичны ситуации 1,
- линии имеют одинаковое количество точек
- линии имеют одинаковые размеры.
Тем не мение,
- Разница в том, что линии значительно дальше друг от друга.
Почему это важно для меня?
Причина, по которой я задаю этот вопрос, заключается в том, что я хочу знать, следует ли мне удалять из входной геометрии как можно большую точность и уменьшать их плотность и близость друг к другу настолько, насколько это может обеспечить мое приложение, не теряя точности.
вопрос 2
Этот вопрос аналогичен первому вопросу, но вместо того, чтобы пространственно приблизиться к другой геометрической фигуре, следует уменьшить сами фигуры до самой маленькой возможной формы, чтобы описать, что именно требуется для приложения.
Например, если бы я использовал индекс SPATIAL для типа данных геометрии, чтобы предоставить данные о датах. Если бы я хотел сохранить диапазон дат из двух дат, я мог бы использовать тип данных datetime в mysql. Однако, что если я захочу использовать тип геометрии, чтобы я преобразовал диапазон дат, взяв каждую отдельную дату и преобразовав ее в unix_timestamp().
Например:
Date("1st January 2011") to Timestamp = 1293861600
Date("31st January 2011") to Timestamp = 1296453600
Теперь я могу создать LINESTRING на основе этих двух целых чисел.
LINESTRING(1293861600 0,1296453600 1)
Если мое приложение на самом деле касается только дней, а количество секунд вообще не важно для диапазонов дат, я должен реорганизовать свои геометрии, чтобы они уменьшились до минимально возможного размера, чтобы выполнить то, что им нужно.
Так что вместо "1293861600" я бы использовал "1293861600" / (3600 * 24), что, как оказалось, "14975.25".
Может ли кто-нибудь помочь заполнить эти пробелы?
1 ответ
При вставке новой записи, двигатель выбирает MBR
который был бы минимально расширен.
Под "минимально расширенным" под двигателем понимается "расширение области" или "расширение периметра", причем первый вариант по умолчанию MySQL
,
Это означает, что пока ваши узлы имеют ненулевую площадь, их абсолютные размеры не имеют значения: чем больше MBR
остаются большими, а меньшие остаются меньшими, и в конечном итоге все узлы окажутся в одном и том же месте. MBR
s
Эти статьи могут быть интересны для вас:
Что касается плотности, то MBR
пересчитываются при разбиении страниц, и существует высокая вероятность того, что все точки, находящиеся слишком далеко от основного кластера, будут удалены при первом разделении на свои собственные MBR
, Это было бы большим, но было бы родительским для всех выдающихся точек в нескольких итерациях.
Это уменьшит время поиска оставшихся точек и увеличит время поиска точек кластера на одну страницу поиска.