检查mysql中的坐标

时间:2014-12-11 07:54:27

标签: mysql coordinates

具有结构

的表跟踪列表
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点。告诉我如何优化查询?谢谢你的回复!

0 个答案:

没有答案