我有一個MySQL選擇語句在我的網站上搜索,當網站變得非常忙時有性能問題。下面的查詢從超過10萬條記錄的表中搜索廣告,距離給定經緯度和距離不超過25英里,並按距離排序。用戶選擇里程數可能會有所不同。MYSQL地理搜索具有距離性能
問題是,我認爲它很慢,因爲它對錶格中的所有記錄進行了計算,而不是那些距緯度和經度25英里以內的記錄。是否可以修改此查詢,以便where子句僅選擇25英里內的廣告?我讀過關於邊界框和空間索引,但我不知道如何將它們應用於此查詢,我是否需要添加一個where子句來選擇記錄經緯度半徑25英里的記錄,我該怎麼做?
SELECT
adverts.*,
round(sqrt((((adverts.latitude - '53.410778') * (adverts.latitude - '53.410778')) * 69.1 * 69.1) + ((adverts.longitude - '-2.97784') * (adverts.longitude - '-2.97784') * 53 * 53)), 1) as distance
FROM
adverts
WHERE
(adverts.type_id = '3')
HAVING
DISTANCE < 25
ORDER BY
distance ASC
LIMIT 120,10
編輯:更新後包括表模式,請注意該表是比較複雜的,所以是查詢,但我已刪除了這是沒有必要爲這個問題的事情。
CREATE TABLE `adverts` (
`advert_id` int(10) NOT NULL AUTO_INCREMENT,
`type_id` tinyint(1) NOT NULL,
`headline` varchar(50) NOT NULL,
`description` text NOT NULL,
`price` int(4) NOT NULL,
`postcode` varchar(7) NOT NULL,
`latitude` float NOT NULL,
`longitude` float NOT NULL,
PRIMARY KEY (`advert_id`),
KEY `latlon` (`latitude`,`longitude`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
當我做一個關於mysql語句的行數設置爲67900這是一個很大的比在25英里半徑解釋,還額外設置爲「使用,其中,使用文件排序」 。
查詢需要0.3秒,這非常慢,特別是當網站每秒獲得大量請求時。
我已經注意到這個查詢有幾個問題,我對如何使它更快一些有一些想法,你可以給我們一個表模式的預覽? (你的主鍵等) – Killrawr