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

MySQL bredde- og længdegradstabelopsætning

Du bør gemme punkterne i en enkelt kolonne af datatypen Point som du kan indeksere med en SPATIAL indeks (hvis din tabeltype er MyISAM ):

CREATE SPATIAL INDEX sx_place_location ON place (location)

SELECT  *
FROM    mytable
WHERE   MBRContains
               (
               LineString
                       (
                       Point($x - $radius, $y - $radius),
                       Point($x + $radius, $y + $radius)
                       )
               location
               )
        AND Distance(Point($x, $y), location) <= $radius

Dette vil drastisk forbedre hastigheden af ​​forespørgsler som "find alle inden for en given radius".

Bemærk, at det er bedre at bruge almindelig TM metriske koordinater (østlig og nordlig) i stedet for polar (bredde- og længdegrad). For små radier er de nøjagtige nok, og beregningerne er meget forenklet. Hvis alle dine punkter er i en halvkugle og er langt fra polerne, kan du bruge en enkelt central meridian.

Du kan selvfølgelig stadig bruge polære koordinater, men formlerne til beregning af MBR og afstanden bliver mere kompleks.



  1. Hvordan nulstiller jeg mysql root adgangskode?

  2. Kom godt i gang med Postgres 13 på Ubuntu 20.04

  3. ActiveRecord-fejl:SAVEPOINT active_record_1 eksisterer ikke

  4. Fejl ved brug af en OLAP-forbindelse:MSOLAP-udbyderen er ikke registreret på den lokale maskine...