PostGIS
Bewahren Sie Lat und Long nicht auf einem solchen Tisch auf. Verwenden Sie stattdessen eine PostGIS-Geometrie oder einen Geografietyp .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Wenn Sie es jetzt abfragen müssen, können Sie KNN (<->
)
was dies tatsächlich auf einem Index tun wird.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
In Ihrer Abfrage haben Sie explizit HAVING distance < 5
. Sie können das auch auf dem Index machen.
SELECT *
FROM foo
WHERE ST_DWithin(foo.geog, ST_MakePoint(x,y)::geography, distance_in_meters)
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Dadurch wird sichergestellt, dass nichts zurückgegeben wird, wenn alle Punkte außerhalb von distance_in_meters
liegen .
Außerdem sind x und y Dezimalzahlen ST_MakePoint(46.06, 14.505)