sql >> Database teknologi >  >> RDS >> Mysql

Koordinater sammenligning i database

Den bedste måde at håndtere nærhedssøgninger på er at starte med en form for afgrænsningsrektangel tilnærmelse og derefter gå derfra til en faktisk stor cirkelafstand mellem mennesker.

Så længe dine breddegrader ikke er for tæt på polerne, er en sjusket, men brugbar tilnærmelse af afstanden mellem to punkter dette (på SQLish):

GREATEST(ABS(lat1-lat2),ABS(long1-long2))

Hvis du vil være mere præcis, og du ved, at du kun bekymrer dig om mennesker, der er inden for, lad os sige, 10 km hinanden kan du bruge en afgrænsende rektangelsøgning som denne.

WHERE latitude_from_table
    BETWEEN latpoint  - (10.0 / 111.045)
        AND latpoint  + (10.0 / 111.045)
  AND longitude_from_table
    BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
        AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))

Dette virker, fordi der er 111.045 km i én breddegrad. Cosinustermene i længdegradsgrænserne forklarer det faktum, at breddelinjerne er tættere på hinanden, når du nærmer dig polerne. Dette lader dig udnytte MySQL-indekser på dine latitude_from_table og longitude_from_table kolonner.

Når du har afgrænsningsrammens nærhed, kan du anvende en formel for storcirkelafstand. Her er baggrunden for det. http://www.plumislandmedia.net/mysql/haversine-mysql- nærmeste-loc/

For den type applikation, du overvejer, er 32-bit IEEE-488 flydende komma masser af præcision for dine koordinater. Hvis de punkter, du ser på, er virkelig tæt på hinanden (mindre end en km eller deromkring), vil du bruge Vincenty-formlen (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) frem for den mere almindelige såkaldte haversine-formel (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Hvis dit antal personer går meget over 300K, kan du overveje at bruge MySQL geospatiale indekseringsskema. Det virker kun med MyISAM-tabeller, men det er meget hurtig til at udføre afgrænsende rektangelsøgninger. Se her. http://www.plumislandmedia.net/mysql/haversine-mysql- nærmeste-loc/



  1. Databasebelastningsbalancering i skyen - MySQL Master Failover med ProxySQL 2.0:Part One (Deployment)

  2. Opret indsæt-trigger for automatisk at øge int-feltet af sammensat PK (streng, int), genstart nummerering ved 1 for nye strenge

  3. Begræns daglig adgang

  4. Er det muligt at bruge Full Text Search (FTS) med LINQ?