Hi.

On Wed, Nov 14, 2001 at 10:02:54AM -0500, [EMAIL PROTECTED] wrote:
> Currently, I am using the following query:
> 
> SELECT DISTINCT o.szZipCode FROM tblZips z,tblZips o WHERE
> z.szZipCode=$szZip AND (3956 * (2 *
> ASIN(SQRT(POWER(SIN(((z.dblLat-o.dblLat)*0.017453293)/2),2) +
> COS(z.dblLat*0.017453293) * COS(o.dblLat*0.017453293) *
> POWER(SIN(((z.dblLon-o.dblLon)*0.017453293)/2),2))))) < $iRadius

Well, the main problem is probably not the complexity of the
expression, but rather the expression itself. MySQL cannot use
indexes, when the columns are within expressions.  

> where $iRadius is the Radius of search
> and $szZip is the zip code (char)
> 
> This runs rather slowly over the 76 thousand zip codes in the US.
> 
> Here are my three solutions:
> 
> 1) Use a subquery (not an option on 3.23)

I don't see how that could speed up the query? Could you give an
example?

> 2) Compute the max/min latitude/longitude and then query on that range
> (proximity becomes a square, but that's not a big deal)

I would take that, rewrite it to a form where MySQL can use indexes
(i.e. o.dblLat between x and y) and keep the calculation above behind
an AND.

So the query can use index to restrict the matching rows to that
square and only calculate the complicated expression for all remaining
zip codes. That should give a nice performace boost.

> 3) Since I am using only 3 radius (10,25,50), compute for those three
> ranges over the entire table and make a new table (I guess around 1.5
> million records will be created, so around 350 MB of space)

You could reduce that to the 50 miles radius and use that condition to
reduces the matching rows with an index and afterwards compute the
complicated expression again.

Bye,

        Benjamin.

-- 
[EMAIL PROTECTED]

---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to