 <p>Besides storing latitude and longitude as double, you'd definitely want to index those fields. However you should be aware of the fact that index operations are most efficient in case of integer fields - and this is an important consideration when it comes to large data volumes.</p> <p>I guess the following algorithm might help you:</p> <ul> <li>introduce additional columns: <ul> <li>LatitudeIdx int = round(Latitude * ScaleFactor)</li> <li>LongitudeIdx int = round(Longitude * ScaleFactor)</li> </ul></li> <li>define value for ScaleFactor which will suite your needs</li> <li>define an index (LatitudeIdx, LongitudeIdx)</li> <li>query you data using LatiduteIdx and LongitudeIdx values (this will be an fast index lookup operation)</li> </ul> <p>What you achieve with *Idx columns and ScaleFactor is actually breaking your data into cells of equal size. Size of the cell is actually 1/ScaleFactor geo degrees, i.e. roughly 111 km/ScaleFactor.</p> <p>So when you retrieve the data with particular LatitudeIdx and LongitudeIdx values you're actually getting all points that fall into the cell defined by those values, i.e. filter your data points. After that you calculate distances to the point of interest and select closest one (you can actually do that directly in query and sort by distance to get the point you need in a single pass).</p>