提高MySQL在点(lat,long)上的性能的方法

提高MySQL在点(lat,long)上的性能的方法,mysql,performance,latitude-longitude,spatial-index,Mysql,Performance,Latitude Longitude,Spatial Index,我有一个应用程序,需要查询带有纬度和经度坐标的表,这些坐标是使用MYSQL的POINT数据类型存储的 我有一个存储函数,可以在给定GPS位置的给定半径内查找附近的LAT和LONG。但是,我的表将包含数十万个条目,因此性能需要达到最佳 我已经编写了以下存储函数,但在可能的800000多行中,返回9000行大约需要4.01秒。有没有更好的方法找到附近的GPS坐标 这是我存储的函数: CREATE PROCEDURE `FindNearbyPoints`( IN RADIUS FLOA

我有一个应用程序,需要查询带有纬度和经度坐标的表,这些坐标是使用MYSQL的POINT数据类型存储的

我有一个存储函数,可以在给定GPS位置的给定半径内查找附近的LAT和LONG。但是,我的表将包含数十万个条目,因此性能需要达到最佳

我已经编写了以下存储函数,但在可能的800000多行中,返回9000行大约需要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

我对该函数的大部分灵感来自:

我不确定数据库是如何设置的,但您可能会考虑使用空间索引,然后构造最小边界矩形来执行查询。通过边界框返回记录后,可以按距离快速排序,并删除半径以外的记录。我们在基因组学中使用这种索引,并定期非常有效地查询10亿行的数据集


mysql文档中有关于空间索引的详细信息

我天真的认为你已经有了不错的表现。我很有兴趣看到改进的建议。