PostGIS
Не съхранявайте шир и дължина на такава маса. Вместо това използвайте PostGIS геометрия или географски тип .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Сега, когато трябва да го направите заявка, можете да използвате KNN (<->
)
което всъщност ще направи това на индекс.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Във вашата заявка изрично имате HAVING distance < 5
. Можете да направите това и в индекса.
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;
Това гарантира, че нищо не се връща, ако всички точки се намират извън distance_in_meters
.
Освен това x и y са десетични числа ST_MakePoint(46.06, 14.505)