Maison >base de données >tutoriel mysql >Comment puis-je trouver efficacement tous les bâtiments dans un rayon de 5 miles d'un point donné ?
Optimisez la requête spatiale : recherchez efficacement tous les bâtiments dans un rayon de 8 km
Cet article explore un problème spatial courant : récupérer tous les bâtiments dans un rayon spécifié à partir d'un point de coordonnées donné. L'utilisation directe de la fonction ST_CONTAINS
peut ne pas être efficace, c'est pourquoi cet article explorera de meilleures solutions.
L'importance de la représentation des données
Avant d'entrer dans les détails techniques, il est important de souligner l'importance d'une représentation correcte des données. Le stockage des données géospatiales dans des colonnes distinctes de longitude et de latitude crée des inefficacités dans les opérations de requête. À cette fin, il est fortement recommandé d'utiliser les types de données geometry
ou geography
, qui encapsulent deux coordonnées dans un seul champ.
Utilisez ST_DWithin pour effectuer efficacement des requêtes de proximité
ST_DWithin
est une fonction puissante qui vérifie directement si deux géométries se trouvent à une distance spécifiée. En convertissant le rayon de recherche en mètres et en le comparant à la distance calculée à l'aide de ST_DWithin
, nous pouvons identifier efficacement les bâtiments dans la plage souhaitée.
<code class="language-sql">SELECT name, long, lat FROM building WHERE ST_DWithin( ST_GEOMETRY_FROM_TEXT('POINT(-84.38653999999998,33.72024)'), ST_POINT(long, lat), 8046.72 ); -- 8046.72 米 = 5 英里</code>
Utilisez ST_Distance pour gérer la distance convertie en miles
Vous pouvez également utiliser ST_Distance
pour calculer la distance entre les formes géométriques. Le résultat est initialement en mètres, mais nous pouvons le convertir en miles en utilisant un simple facteur de multiplication :
<code class="language-sql">SELECT name, long, lat, ST_Distance( ST_GEOMETRY_FROM_TEXT('POINT(-84.38653999999998,33.72024)'), ST_POINT(long, lat) ) * 0.000621371 AS distance FROM building WHERE distance < 5;</code>
Remarque : Lors de l'utilisation de ST_Distance
, les requêtes spatiales doivent être traitées efficacement à l'aide d'index. Bien que ST_Distance
lui-même ne prenne pas en charge l'indexation, la création d'un index spatial sur ST_GEOMETRY
peut optimiser les performances globales des requêtes.
Résumé
En explorant des approches alternatives et en mettant l'accent sur l'optimisation de la représentation des données, nous démontrons une méthode permettant de récupérer efficacement des bâtiments dans une plage spécifiée. Les techniques présentées dans cet article offrent des améliorations en termes d'évolutivité et de performances pour les requêtes spatiales dans les applications du monde réel.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!