Зависит ли производительность индексов SPATIAL Geometry от размера и плотности геометрических фигур? - PullRequest
1 голос
/ 30 марта 2011

Пространственные индексы

Учитывая пространственный индекс, это утилита индекса, то есть общая производительность индекса, только такая же хорошая, как и общая геометрия.

Например, если бы я взял миллион типов данных геометрии и вставил их в таблицу так, чтобы их относительные точки были плотно расположены друг к другу, делает ли этот индекс лучше для идентичных геометрических фигур, относительное расположение которых могло бы быть значительно более разреженный.

Вопрос 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 Ответ

1 голос
/ 30 марта 2011

При вставке новой записи, двигатель выбирает MBR, который будет минимально расширен.

Под «минимально расширенным» двигатель может подразумевать «расширение области» или «расширение периметра», первое из которых по умолчанию используется в MySQL.

Это означает, что до тех пор, пока ваши узлы имеют ненулевую площадь, их абсолютные размеры не имеют значения: большие MBR остаются большими, а меньшие остаются меньшими, и в конечном итоге все узлы окажутся в одном и том же месте. MBR S

Эти статьи могут вас заинтересовать:

Что касается плотности, MBR пересчитывается при разбиении страниц, и существует высокая вероятность того, что все точки, находящиеся слишком далеко от основного кластера, будут смещены при первом разделении на свои MBR. Он будет большим, но будет родительским для всех выдающихся точек за несколько итераций.

Это уменьшит время поиска оставшихся точек и увеличит время поиска точек кластера на одну страницу поиска.

...