У меня есть довольно большая база данных из 20 миллионов записей географических точек, и она растет с каждым днем.Ускорение этого запроса mysql
[id (int)] [group (int)] [latitude (double)] [longitude(double)]
[1] [1] [22.365598] [12.55678]
[2] [1] [22.365548] [12.55238]
[3] [2] [24.665348] [13.10238]
Теперь я хочу, чтобы каждый пункт внутри данной boudingbox.The boudingbox имеет размер Южной Африки и запрос должен возвращать около 7,000 результатов. Но для получения результатов требуется 30 секунд.
Этот запрос:
SELECT distinct(group), id from `table`
where (latitude between -95.22 and 36.458 and longitude between -51.939 and 103.833);
Индекс [широта, долгота] (ВТКЕЕ).
Как я могу ускорить это?
EDIT
То, что я хочу сделать
База данных содержит большой набор полигонов. Скажем, например, Национальные парки. Каждый узел в многоугольнике находится в этой таблице. Теперь я хочу проверить, находится ли национальный парк в пределах данной позиции.
Id - это идентификатор узла, группа - это многоугольник, к которому он принадлежит, а широта и долгота - это положение узла.
Когда я не использую отчетливо, запрос завершится за 3 секунды, но будет возвращено 900.000 результатов. который много для обработки в остальной части кода.
гуманного
Как Гордон Линофф в своем ответе говорит: это действительно большая поверхность. Запрос используется для некоторых реальных подробных результатов. С этой большой поверхностью я не должен использовать все узлы из всех полигонов, но использовать многоугольник многоугольника. Когда мне нужны подробные результаты для небольших поверхностей, этот запрос выполняется достаточно быстро.
Так что я думаю, что придерживаюсь этого.
Интересно, поможет ли добавление группы в индекс. Но тогда вы почти дублировали таблицу в индексе. – Matt
Показатели долготы и широты должны быть btree для запроса – splash58
Индекс isbtree – NLAnaconda