Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête de résultat de recherche basée sur la localisation lente

Vous pouvez utiliser l'extension spatiale mysql et enregistrer la latitude et la longitude en tant que type de données de point et en faire un index spatial. De cette façon, vous pouvez réorganiser les coordonnées le long d'une courbe et réduire la dimension et conserver les informations spatiales. Vous pouvez utiliser l'index spatial comme cadre de délimitation pour filtrer la requête, puis utiliser la formule harvesine pour sélectionner le résultat optimal. Votre boîte englobante doit être plus grande que le rayon du grand cercle. Mysql utilise un rtree avec un index spatial et mon exemple concernait une courbe z ou une courbe hilbert :https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing .Ensuite, vous pouvez insérer une géocoordonnée directement dans une colonne de points :http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html . Ou vous pouvez utiliser un type de données géométrique :http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ . Ensuite, vous pouvez utiliser la fonction MBRcontains comme ceci : http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html ou toute autre fonction :http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html . Par conséquent, vous avez besoin d'une boîte englobante.Voici quelques exemples :

Voici un exemple simple avec le type de données point :

    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

Je ne sais pas si cela fonctionne car il utilise une variable de rayon avec une fonction de boîte englobante. Il me semble que MBRwithin est un peu plus simple, car il n'a besoin d'aucun argument :Mysql :Optimisation de la recherche de super nœuds dans l'arborescence d'ensembles imbriqués .