Способ повышения производительности в MySQL на POINT (lat, long) - PullRequest
1 голос
/ 19 октября 2010

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

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

Я написал следующую хранимую функцию, но для возврата около 9 000 строк из возможных 800 000+ строк требуется около 4,01 секунды. Есть ли лучший способ найти близлежащие координаты GPS?

Вот моя сохраненная функция:

    CREATE PROCEDURE `FindNearbyPoints`(
    IN RADIUS FLOAT,
    IN LAT FLOAT,
    IN LON FLOAT
)
BEGIN

    DECLARE EARTH_RADIUS FLOAT DEFAULT 3959;
    DECLARE maxLat FLOAT DEFAULT (LAT + DEGREES(RADIUS/EARTH_RADIUS));
    DECLARE minLat FLOAT DEFAULT (LAT - DEGREES(RADIUS/EARTH_RADIUS));

    /* compensate for degrees longitude getting smaller with increasing latitude*/
    DECLARE maxLon FLOAT DEFAULT (LON + DEGREES(RADIUS/EARTH_RADIUS/COS(RADIANS(LAT))));
    DECLARE minLon FLOAT DEFAULT (LON - DEGREES(RADIUS/EARTH_RADIUS/COS(RADIANS(LAT))));

    SELECT *, acos(sin(LAT)*sin(radians(X(Location))) + cos(LAT)*cos(radians(X(Location)))*cos(radians(Y(Location))-LON))*EARTH_RADIUS As D
    FROM (
        Select *
        From my_table
        Where X(Location)>minLat And X(Location)<maxLat
        And Y(Location)>minLon And Y(Location)<maxLon
    ) AS FIRST_CUT
    WHERE acos(sin(LAT)*sin(X(Location)) + cos(LAT)*cos(X(Location))*cos(Y(Location)-LON))*EARTH_RADIUS < RADIUS
    ORDER BY D;

END

Большая часть моего вдохновения для этой функции пришла от: http://www.movable -type.co.uk / scripts / latlong-db.html

1 Ответ

0 голосов
/ 19 октября 2010

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

Подробная информация о пространственной индексации содержится в документах mysql.

...