Maison  >  Article  >  base de données  >  ## Comment optimiser les requêtes MySQL pour des recherches de géolocalisation précises en utilisant la latitude et la longitude ?

## Comment optimiser les requêtes MySQL pour des recherches de géolocalisation précises en utilisant la latitude et la longitude ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-25 19:52:02343parcourir

## How to Optimize MySQL Queries for Accurate Geolocation Searches Using Latitude and Longitude?

Optimisation des requêtes MySQL pour les recherches de géolocalisation à l'aide de la latitude et de la longitude

Dans MySQL, la récupération de données en fonction de la proximité géographique est une tâche courante. Lorsque vous travaillez avec des valeurs de longitude et de latitude, il est essentiel d'utiliser des requêtes efficaces pour éviter des résultats inattendus.

Considérez la requête suivante qui tente de trouver des lignes dans un rayon de 25 miles autour d'une latitude et d'une longitude centrale :

<code class="sql">SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180))
* cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515)
AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC</code>

Bien que cette requête fonctionne généralement, elle peut produire des résultats inexacts pour certaines lignes, les affichant beaucoup plus loin du rayon spécifié.

Pour améliorer la précision, envisagez la requête optimisée suivante :

<code class="sql">SELECT
    `id`,
    (
        6371 *
        acos(
            cos( radians( :lat ) ) *
            cos( radians( `lat` ) ) *
            cos(
                radians( `long` ) - radians( :long )
            ) +
            sin(radians(:lat)) *
            sin(radians(`lat`))
        )
    ) `distance`
FROM
    `location`
HAVING
    `distance` < :distance
ORDER BY
    `distance`
LIMIT
    25</code>

Dans cette requête, les paramètres :lat et :long représentent la latitude et la longitude du point central, et :distance représente le rayon en miles.

La principale différence entre les deux requêtes est l'utilisation de 6371 comme facteur de conversion pour convertir les radians en miles. Ce facteur est plus précis que 3959, utilisé dans la requête d'origine. De plus, la requête optimisée utilise une formule plus stricte pour calculer la distance en fonction de la latitude et de la longitude.

En mettant en œuvre ces optimisations, vous pouvez améliorer considérablement la précision de vos requêtes MySQL lorsque vous effectuez des recherches de géolocalisation à l'aide de valeurs de latitude et de longitude, en veillant à ce que les résultats soient toujours dans la distance de rayon spécifiée.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn