Ще бъдете много по-добре, ако използвате пространствен индекс, който използва R-дърво (по същество двуизмерен индекс, който работи чрез разделяне на пространството на кутии) и ще се представи много по-добре от по-голямо от, по-малко от сравнения на две отделни шир. , lon стойности на този вид заявка. Първо обаче ще трябва да създадете геометричен тип, който след това да индексирате и използвате в заявката си вместо отделните двойки ширина/дължина, които използвате в момента.
Следното ще създаде геометричен тип, ще го попълни и ще добави индекс към него, като гарантира, че е точка и в широчина/дължина, известен като EPSG:4326
alter table event add column geom geometry(POINT, 4326);
update event set geom=ST_SetSrid(ST_MakePoint(lon, lat), 4326);
create index ix_spatial_event_geom on event using gist(geom);
След това можете да изпълните следната заявка, за да получите вашите събития, които ще използват пространствени пресичания, които трябва да използват вашия пространствен индекс:
Select * from events where ST_Intersects(ST_SetSRID(ST_MakeBox2D(ST_MakePoint(swLon, swLat),
ST_MakePoint(neLon, neLat)),4326), geom)
order by relevancy desc limit 100;
Вие правите ограничителната кутия за вашето пресичане, като използвате ST_MakeBOX2D с два комплекта точки, които ще бъдат в диагоналните ъгли на ограничителната кутия, така че двойките SW и NE или SW и SE ще работят.
Когато стартирате обяснение за това, трябва да откриете, че пространственият индекс е включен. Това ще се представи значително по-добре от два отделни индекса на колони за дължина и ширина, тъй като удряте само едно индексирано, оптимизирано за пространствено търсене, а не две B-дървета. Разбирам, че това представлява друг начин да го направите и не отговаря на първоначалния ви въпрос, освен косвено.
РЕДАКТИРАНЕ: Mike T отбеляза много добре, че за търсения в ограничителна кутия в 4326 е по-подходящо и по-бързо да се използва геометричен тип данни и операторът &&като SRID така или иначе ще бъде игнориран, напр.
where ST_MakeBox2D(ST_MakePoint(swLon, swLat), ST_MakePoint(neLon, neLat)) && geom