|
|
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
Всем привет. Хочется как всегда странного, а именно, у меня есть мильён объектов вида (Ид, Долгота, Широта). Теперь хочется найти те объекты которые попадают в заданную прямоугольную область. Другими словами надо найти объекты у которых А<широта<В, С<долгота<Д Как оптимально искать, абстрагируясь от конкретных БД вообще и SQL в частности. Что мне приходит в голову, отсортировать все объекты к примеру по долготе, бинарным поиском находить границы для долготы, а затем все объекты в этих границах проверять на широту. Вопрос - можно как то задействовать второй индекс, чтобы не перебирать все объекты? Как вообще базы ищут в таких ситуациях? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 16:53 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
MaximSpb, обычно создается индекс по двум полям и задаются условия на запрос А<широта<В, С<долгота<Д ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 17:00 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
В базах использующих SQL (декларативный язык) не интересуются как искать, а пишут только что искать - условия, но при этом осознавая, как все же происходит поиск "помогают" БД - делают индексы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 17:25 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
Может партицирование наложить, тогда своего рода некие области будут по широте-долготе. Это если можно более менее прямоугольную сетку наложить на ваши координаты и в этом будет логика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 17:30 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
MaximSpbЧто мне приходит в голову, отсортировать все объекты к примеру по долготе, бинарным поиском находить границы для долготы, А создание индекса, который хранится в виде бинарного дерева, не реализует эту идею автоматически ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 17:35 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
Edd.DragonА создание индекса, который хранится в виде бинарного дерева, не реализует эту идею автоматически ? можно и так, просто если хранить в виде простого отсортированного по широте массива, достаточно найти нижнюю границу бинарным поиском и двигаться последовательно вверх пока широта не превысит максимального значения. и еще просто не уверен что помню как быстро передвигаться от элемента к элементу в дереве. но это все тех. детали. не ясно главное, а именно как задействовать второй индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 22:02 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
lLocustMaximSpb, обычно создается индекс по двум полям и задаются условия на запрос А<широта<В, С<долгота<Д есть понимание как это внутри работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 22:02 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
AlexGruМожет партицирование наложить, тогда своего рода некие области будут по широте-долготе. Это если можно более менее прямоугольную сетку наложить на ваши координаты и в этом будет логика. думаю сейчас про это, но как то все корявенько получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 22:03 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
MaximSpb, по Винипегии ДОЛГОТА - анг. Longitude Значок долготы Долгота делится на западную и восточную. Отсчитывается от нулевого меридиана, в диапазоне от 0° до 180°. Западная долгота считается отрицательной (от 0° до -180°), восточная положительной (от 0° до 180°). Широта ШИРОТА - анг. Latitude Значок широты Принято считать, что точки лежащие в южном полушарии являются отрицательными от 0° до -90°, а в северном полушарии положительными от 0° до +90°. -возникшие вопросы -единица измерения градус-мин-секформа представления в таблице 45^20'25'', или есть еще мельче-шаг по долготеразность С - Д-шаг по широтеразность А - В иначе говоря: каково потенциальное количество объектов при типичном размере А-В-С-Д -если 1 градус 1млн/180=5500 объект на градус по долготе -если 1 минута ...............=90..............на..минуту................ ............ это конечно общие знания,без знания вашей специфики ............ болтовня по другому говоря ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 22:50 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
MaximSpblLocustMaximSpb, обычно создается индекс по двум полям и задаются условия на запрос А<широта<В, С<долгота<Д есть понимание как это внутри работает? Есть. А у Вас? MaximSpbу меня есть мильён объектов вида (Ид, Долгота, Широта) Это не много, у меня есть миллиард объектов вида (Ид,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...,...) MaximSpbКак оптимально искать, абстрагируясь от конкретных БД вообще и SQL в частности. Т.е. Вас интересует как сделать свой поиск? а зачем, если не секрет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2010, 11:29 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
MaximSpb, авторотсортировать а сортировать по широте или долготе собрался? Иначе опять фулл скан, так сказать..... Короче не морочте людям голову, все придумано до нас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2010, 16:55 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
lLocustЕсть. А у Вас? нет поэтому и спрашиваю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 18:12 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
Ivan DurakMaximSpb, авторотсортировать а сортировать по широте или долготе собрался? Иначе опять фулл скан, так сказать..... Короче не морочте людям голову, все придумано до нас да, сортирую по одному из параметров, а по второму получается фул скан чего и хочется избежать. приходиться изобретать потому что запросов слишком много, база умирает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 18:14 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
lLocust Т.е. Вас интересует как сделать свой поиск? а зачем, если не секрет? слишком много запросов для базы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2010, 18:15 |
|
||
|
Оптимальный поиск по двум полям
|
|||
|---|---|---|---|
|
#18+
MaximSpb, Для таких случаем покупают дополнительной оперативки и хранят базу в памяти. Далее, как все это устроено в базе (если просто и на пальцах), то в виде дерева, уже отсортированного (примеров дофига искать по словам b-tree , ну да ладно), например в базе есть числа: 1368910111545 >9 / \ >6 >11 / \ / \ ... ... ... ... т.е. при поиске числа 11 мы его сравниваем с 9, потом с 11 и т.д. вниз по дереву пока не дойдем до него (это ищем нижнюю границу), потом так же ищем верхнюю границу, потом берем все числа внутри... лучше почитать Кайта, у него неплохо все описано... Если индекс по двум полям, то принцип тот же. Далее, а что у вас за база? которую вы чуть ли не ручками сортируете, что бы потом по ней пробежаться? Повторюсь, индексы работают по другому. и поиск по индексу более чем оптимальный (самому такой реализовать сложно..., да и нужно ли?) Далее, 1 миллион - это не много, тем более, что информация у Вас довольно упорядочена и ее мало (всмысле 1 запись - это всего 3 числа), т.е. дерево индекса будет сбалансировано. Просто сделайте индекс по двум полям (можно даже 2 индекса, по принципам ширина/долгота и долгота/ширина) и посмотрите планы запросов что получилось. И количество запросов тут практически не при чем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2010, 11:27 |
|
||
|
|

start [/forum/topic.php?fid=32&tid=1542430]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 437ms |

| 0 / 0 |
