首頁  >  文章  >  資料庫  >  ## 如何最佳化 MySQL 查詢以使用緯度和經度進行準確的地理位置搜尋?

## 如何最佳化 MySQL 查詢以使用緯度和經度進行準確的地理位置搜尋?

Patricia Arquette
Patricia Arquette原創
2024-10-25 19:52:02343瀏覽

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

使用緯度和經度優化用於地理位置搜尋的MySQL 查詢

在MySQL 中,基於地理鄰近度檢索資料是一項常見任務。使用經度和緯度值時,必須使用高效率的查詢來避免意外結果。

考慮以下查詢,該查詢嘗試查找中心緯度和經度25 英里半徑內的行:

<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>

雖然此查詢通常有效,但它可能會為某些行生成不準確的結果,顯示它們距離指定半徑更遠。

為了提高準確性,請考慮以下最佳化查詢:

<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>

在此查詢中,:lat 和:long 參數表示中心點的緯度和經度,:distance 表示以英里為單位的半徑。

兩個查詢之間的主要區別是使用 6371 作為轉換係數將弧度轉換為英里。該係數比原始查詢中使用的 3959 更準確。此外,優化後的查詢使用更嚴格的公式來計算基於緯度和經度的距離。

透過實作這些最佳化,您可以在使用緯度和經度值執行地理位置搜尋時顯著提高 MySQL 查詢的準確性,確保結果始終在指定的半徑距離內。

以上是## 如何最佳化 MySQL 查詢以使用緯度和經度進行準確的地理位置搜尋?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn