【发布时间】:2016-02-03 13:47:06
【问题描述】:
我创建了一个位置表,其中保存了纬度、经度和位置。我的要求是当我通过 lat,long 时,将获得距该位置表 10 英里内的最近位置。位置表结构如下:-
CREATE TABLE IF NOT EXISTS `locations` (
`latitude` float(14,12) unsigned NOT NULL,
`longitude` float(14,12) unsigned NOT NULL,
`location` varchar(150) NOT NULL,
PRIMARY KEY (`latitude`,`longitude`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
和 我的查询是:-
SELECT
(3959 * ACOS(COS(RADIANS(lat)) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS(long)) + SIN(RADIANS(lat)) * SIN(RADIANS(latitude)))) AS distance,
location
FROM
locations
HAVING distance < 10
ORDER BY distance
LIMIT 0 , 1
我正在使用 MySql 5.6。 位置表中有大约 39,000 个数据。 当这个查询执行时,它需要 5 到 6 秒。
谁能帮我减少执行时间?
谢谢!
【问题讨论】:
-
虽然看起来代码要多得多,但我怀疑“WHERE(3959 等...”)会明显更快。地址真的不可能在阿拉斯加的安克雷奇吗?说什么?
-
这是一个棘手的问题。但是代码here 会更快。但这需要对您的架构进行重大更改。
-
不要在
FLOAT上使用(M,N)。此外, (14,12) 会将经度切割为 100;可能不是你想要的。
标签: mysql distance latitude-longitude