2013-12-13 6 views
0

У меня есть таблица с более чем 8 миллионами записей (geonames). Внутри этой таблицы имеется 19 столбцов, из которых 2 - широта и долгота.Ускорить запрос mysql для расстояния (широта, долгота)

Я хочу, чтобы найти ближайшее место от значений широты и долготы, и я делаю запрос:

SELECT * , (6371 * ACOS(COS(RADIANS(40.8333333)) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS(14.25)) + SIN(RADIANS(40.8333333)) * SIN(RADIANS(latitude)))) AS distance 
FROM geoname 
WHERE fclass = 'P' 
HAVING distance <25 
ORDER BY distance 
LIMIT 0 , 20 

Я установил ВТКЕЕ индекс йоту FCLASS, широта и долгота.

Проблема в том, что запрос занимает 5,6027 секунд. слишком много. Есть ли способ его оптимизировать? Я делаю что-то неправильно?

Благодаря

+0

Посмотрите на [** Как оптимизировать SQL-запрос с вычислением расстояния по долготе и широте? **) (http://stackoverflow.com/questions/3093964/how-to-optimize-sql-query-with-calculate-distance-by-longitude-and-latitude) –

+1

Первое, что нужно сделать, чтобы определить максимум с использованием примера расстояния прямоугольника: 'WHERE latitude Y и долгота W', которую вы вычисляете один раз. Это позволит устранить 90-95% возможностей и утонченность с реальным расстоянием займет гораздо меньше времени. –

+0

Спасибо, Александр. Это решение ускоряется на 0,04 с запросом! :) – Luca

ответ

0

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

На вашем месте я либо перемещаю данные в пространственную базу данных, либо вставляю свои данные в дерево метрик (здесь может быть лучший выбор kd-tree) и выдавать запрос к дереву.

0

Вы можете попробовать свою удачу с помощью spatial indices. Это будет связано с использованием механизма хранения MyISAM, однако,

 Смежные вопросы

  • Нет связанных вопросов^_^