具有结构
的表跟踪列表CREATE TABLE `tracklist` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`dtime` datetime DEFAULT NULL,
`lat` varchar(255) DEFAULT NULL,
`lon` varchar(255) DEFAULT NULL,
`received` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
KEY `lat_lon` (`lat`,`lon`),
KEY `user_id_dtime` (`user_id`,`dtime`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
和带结构的表格点
CREATE TABLE `points` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lat` varchar(100) NOT NULL DEFAULT '',
`lon` varchar(100) NOT NULL DEFAULT '',
`naspunct_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
KEY `lat_lon` (`lat`,`lon`),
KEY `id_title` (`id`,`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我需要获得所有积分,旁边是白天用户。有一个考虑距离的函数
CREATE FUNCTION dist(lat1 float, lon1 float, lat2 float, lon2 float) RETURNS float
BEGIN
declare d_lon float;
declare x float;
declare y float;
set lat1 = lat1 * pi() / 180;
set lon1 = lon1 * pi() / 180;
set lat2 = lat2 * pi() / 180;
set lon2 = lon2 * pi() / 180;
set d_lon = lon1 - lon2;
set y = POWER(COS(lat2) * SIN(d_lon), 2) + POWER(COS(lat1) * SIN(lat2) - SIN(lat1) * COS(lat2) * COS(d_lon), 2);
set x = SIN(lat1) * SIN(lat2) + COS(lat1) * COS(lat2) * COS(d_lon);
RETURN ATAN2(SQRT(y), x) * 6372795;
END;
并选择查询
SELECT
s.id,
c.title
FROM
`points` AS s
JOIN tracklist AS t
INNER JOIN cities AS c ON s.naspunct_id = c.id
WHERE
dist (s.lat, s.lon, t.lat, t.lon) < 500
AND t.user_id = 2
AND t.dtime < '2014-12-08 08:00:00'
AND t.dtime > '2014-12-08 07:00:00'
AND LENGTH(s.lat) > 0
GROUP BY
s.id
查询执行时间为30秒。线路列表120000和1500点。告诉我如何优化查询?谢谢你的回复!