我對MySQL和數據庫一般都很陌生,但我有一個似乎需要很長時間的查詢。我從一個位置數據庫中找到距離另一個位置5英里內的使用經緯度座標的約700,000個位置。問題是,這需要2.12秒的時間才能完成,而且我很擔心,一旦我開始獲取流量,MySQL就會阻塞。這裏是我的代碼:mysql查詢時間很慢select
SELECT *,((ACOS(SIN(44.4726 * PI()/180) * SIN(lat * PI()/180) + COS(44.4726 * PI()/ 180) * COS(lat * PI()/180) * COS((-93.1785 - lon) * PI()/180)) * 180/PI()) * 60 * 1.1515) AS distance FROM locations HAVING distance<=5 ORDER BY distance ASC LIMIT 30;
我有lat和lon字段索引但它仍然需要很長時間。這是與我要求服務器做什麼的預期?我是否可以通過添加加速
WHERE state = "$state"
如果是的話,我會在Select?
我已經閱讀了關於空間數據類型的經緯度和座標座標的幾篇文章,但也看到這是一個糟糕的主意,所以決定嘗試做我所做的工作。此外,我可能聽起來像我有更多的知識,這比我實際上... ...大聲笑。那麼你可以貶低where子句嗎?我只是想知道如何添加「WHERE column = $ variable」以及如何將它包含在我當前的查詢字符串中 – whatdafrak
我明白了!我把一個關於狀態的索引並將我的代碼更改爲這個'....AS距離位置WHERE state ='mn'HAVING distance .....'。它將我的查詢從2.12秒變爲.262秒。我不會抱怨的。如果一個城市位於兩個州的邊界上,我可能會遇到問題,因爲它不會在邊界地區找到地點。但直到我能想出更長久的東西,我纔開心。謝謝您的幫助 – whatdafrak