我已经找到了比 @1000111 的解决方案更好的解决方法。
MySQL 中有一种自定义的 DB 类型适用于这种数据,可以提供更好的性能。
MySQL 中的 OpenGIS非常适合此类问题。
函数列表点击这里。
该StackOverflow问题中给出了对示例定义的说明。
我的解决方案如下 -
DB 表格 -
CREATE TABLE geoTable
(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
geoPoint POINT NOT NULL,
SPATIAL INDEX(geoPoint)
) ENGINE=MyISAM;
INSERT INTO geoTable (name, geoPoint)
VALUES
( "A", GeomFromText('POINT(0.1 -1.01)') ),
( "B", ST_GeomFromText('POINT(56.31 2.81)') ),
( "C", ST_GeomFromText('POINT(11.1 1.176)') ),
( "ui", ST_GeomFromText('POINT(9.1 2.1)') );
SQL查询-
SELECT
id,
name,
X(geoPoint) AS "latitude",
Y(geoPoint) AS "longitude",
(
GLength(
LineStringFromWKB(
LineString(
geoPoint,
GeomFromText('POINT(51.5177 -0.0968)')
)
)
)
)
AS distance
FROM geoTable
ORDER BY distance ASC;
这里提供了一个SQL Fiddle的示例,点击这里查看。
查看执行时间-
![enter image description here](https://istack.dev59.com/donJs.webp)
对于150条数据,只需要13毫秒。