sql >> Databasteknik >  >> RDS >> Mysql

Långsam platsbaserad sökresultatfråga

Du kan använda mysql spatial extension och spara latitud och longitud som en punktdatatyp och göra det till ett rumsligt index. På så sätt kan du ordna om koordinaterna längs en kurva och minska dimensionen och bevara rumslig information. Du kan använda det rumsliga indexet som en begränsningsruta för att filtrera frågan och sedan använda harvesineformeln för att välja det optimala resultatet. Din begränsningsram bör vara större än storcirkelns radie. Mysql använder ett rtree med något rumsligt index och mitt exempel handlade om en z-kurva eller en hilbert-kurva:https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing .Sedan kan du infoga en geokoordinat direkt i en punktkolumn:http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html . Eller så kan du använda en geometridatatyp:http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ . Då kan du använda MBRcontains-funktionen så här: http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html eller andra funktioner:http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html . Därför behöver du en begränsningsram. Här är några exempel:

Här är ett enkelt exempel med punktdatatyp:

    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

Jag är inte säker på om det fungerar eftersom det använder en radievariabel med en bounding-box-funktion. Det verkar för mig att MBRwithin är lite enklare, eftersom det inte behöver några argument:Mysql:Optimering av att hitta supernod i kapslat uppsättningsträd .



  1. Problem när man jämför resultatet av to_char(myDate, 'DAY') med en sträng

  2. Hur man installerar SQL Server på Red Hat 8

  3. Ormlite eller sqlite Vilken är bra för Android-perspektiv?

  4. Använda MS Access-data i en brevkoppling