Budete na tom mnohem lépe s prostorovým indexem, který používá R-strom (v podstatě dvourozměrný index, který funguje tak, že rozděluje prostor do rámečků), a bude mít mnohem lepší výkon než větší než, menší než srovnání na dvou samostatných lat. , hodnoty lon pro tento druh dotazu. Nejprve však budete muset vytvořit typ geometrie, který pak indexujete a použijete ve svém dotazu namísto samostatných párů zeměpisná šířka/délka, které aktuálně používáte.
Následující vytvoří typ geometrie, naplní jej a přidá k němu index, čímž zajistí, že se jedná o bod a v zeměpisné šířce/délce, známé jako 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);
Poté můžete spustit následující dotaz, abyste získali své události, které budou používat prostorový průsečík, který by měl využívat váš prostorový index:
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;
Ohraničovací rámeček pro svůj průsečík vytvoříte pomocí ST_MakeBOX2D se dvěma sadami bodů, které budou na diagonálních rozích ohraničujícího rámečku, takže dvojice JZ a SV nebo SZ a JV by fungovaly obě.
Když na to spustíte vysvětlení, měli byste zjistit, že je zahrnut prostorový index. To bude fungovat mnohem lépe než dva samostatné indexy na sloupcích lon a lat, protože narazíte pouze na jeden indexovaný, optimalizovaný pro prostorové vyhledávání, spíše než na dva B-stromy. Uvědomuji si, že to představuje jiný způsob, jak to udělat, a neodpovídá vám na původní otázku, leda nepřímo.
UPRAVIT: Mike T velmi dobře poznamenal, že pro hledání ohraničujícího rámečku v 4326 je vhodnější a rychlejší použít datový typ geometrie a operátor &&, protože SRID bude stejně ignorováno, např.
where ST_MakeBox2D(ST_MakePoint(swLon, swLat), ST_MakePoint(neLon, neLat)) && geom