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

Query dei risultati di ricerca basata sulla posizione lenta

È possibile utilizzare l'estensione spaziale mysql e salvare la latitudine e la longitudine come tipo di dati punto e renderlo un indice spaziale. In questo modo è possibile riordinare le coordinate lungo una curva, ridurre la dimensione e preservare le informazioni spaziali. È possibile utilizzare l'indice spaziale come riquadro di delimitazione per filtrare la query e quindi utilizzare la formula harvesine per selezionare il risultato ottimale. Il tuo rettangolo di selezione dovrebbe essere più grande del raggio del cerchio massimo. Mysql usa un rtree con un certo indice spaziale e il mio esempio riguardava una curva z o una curva di hilbert:https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing .Quindi puoi inserire una geocoordinata direttamente in una colonna di punti:http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html . Oppure puoi utilizzare un tipo di dati geometrico:http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ . Quindi puoi utilizzare la funzione MBRcontains in questo modo: http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html o qualsiasi altra funzione:http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html . Quindi hai bisogno di un rettangolo di selezione. Ecco alcuni esempi:

Ecco un semplice esempio con tipo di dati punto:

    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

Non sono sicuro che funzioni perché utilizza una variabile raggio con una funzione di riquadro di delimitazione. Mi sembra che MBRwithin sia un po' più semplice, perché non ha bisogno di alcun argomento:Mysql:ottimizzazione della ricerca di super nodi nell'albero degli insiemi nidificati .