Вы не в полной мере используете PostGis, потому что еще не используете пространственные индексы.
Чтобы создать индекс в своей таблице:
create index my_index_points_gist on mypoints using gist(the_geom);
Затем выполните cluster
иanalyze
на вашем столе:
cluster mypoints using my_index_points_gist;
analyze mypoints;
Я вижу, что вы используете сферическое расстояние, было бы лучше, если бы вы использовали тип географии:
CREATE TABLE mypoints ( id serial primary key, name varchar(50), geog geography );
Вставьте данные обычным способом, добавляя приведение к типу geograhy:
INSERT INTO cities (geog, name) VALUES (ST_GeomFromText('POINT(-3.782 40.4351)',4326)::geography, 'point_label');
Либо просто добавьте дополнительный столбец geography:
alter table mypoints add column geog::geography;
update table mypoints set geog = the_geom::geography;
создать индекс, но на этот раз с использованием geog
create index my_index_points_gist_geog on mypoints using gist(geog);
cluster mypoints using my_index_points_gist_geog;
analyze mypoints;
А для запроса вы можете использовать:
select name from cities
where ST_Distance(geog,ST_GeomFromText('POINT(-3.713 40.4321)',4326)::geog)<500;
Или еще лучше:
select name from cities
where ST_DWITHIN(geog,ST_GeomFromText('POINT(-3.713 40.4321)',4326)::geog,500);
Для справки: Тип географии postgis