Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Langsame standortbasierte Suchergebnisabfrage

Sie können die mysql räumliche Erweiterung verwenden und den Breiten- und Längengrad als Punktdatentyp speichern und daraus einen räumlichen Index machen. Auf diese Weise können Sie die Koordinaten entlang einer Kurve neu anordnen, die Dimension reduzieren und räumliche Informationen bewahren. Sie können den räumlichen Index als Begrenzungsrahmen verwenden, um die Abfrage zu filtern, und dann die Harvesine-Formel verwenden, um das optimale Ergebnis auszuwählen. Ihr Begrenzungsrahmen sollte größer sein als der Radius des Großkreises. Mysql verwendet einen rtree mit einem räumlichen Index und mein Beispiel handelte von einer z-Kurve oder einer Hilbert-Kurve:https://softwareengineering.stackexchange.com/questions/113256/was-ist-der-unterschied-zwischen-btree-und-rtree-indexing .Dann können Sie eine Geokoordinate direkt in eine Punktspalte einfügen:http://dev.mysql.com/doc/refman/5.0/en/erstellen-räumlicher-werte.html . Oder Sie können einen Geometriedatentyp verwenden:http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ . Dann können Sie die MBRcontains-Funktion wie folgt verwenden: http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html oder andere Funktionen:http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html . Daher benötigen Sie einen Begrenzungsrahmen. Hier sind einige Beispiele:

Hier ist ein einfaches Beispiel mit Punktdatentyp:

    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

Ich bin mir nicht sicher, ob es funktioniert, weil es eine Radiusvariable mit einer Bounding-Box-Funktion verwendet. Es scheint mir, dass MBRwithin etwas einfacher ist, weil es kein Argument braucht:Mysql:Optimierung der Suche nach Superknoten im verschachtelten Set-Baum .