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!