通过Lat / Long更多组织Mysql数据库

时间:2012-09-11 04:39:35

标签: mysql sql gis

我需要组织一个包含7,000,000条记录的Mysql数据库。它需要通过Lat / Long方格查询,例如:22.54x -134.74x。它还需要按monthname进行细分。大约有700个可能的名字。

我不知道如何管理所有这些数据,以便该纬度/长方形内的某个人可以快速查询该月内存在的names和纬度/长方形。

每个纬度/长度可能需要10,000张表吗?然后从那里分解成几个月和名字?我的思绪即将爆发。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

MySQL提供spatial extensions that are specifically designed to efficiently deal with lat/long type problems

如果您使用这些扩展,则给定行将包含地点的相关纬度和经度,并且查询将描述您感兴趣的几何边界。

您的查询可以看起来像

SELECT name, AsText(location) FROM Points 
    WHERE X(location) > 0 AND X(location) < 1 AND
    Y(location) > 38 AND Y(location) < 39 

这将选择位置(此处位置是数据库中的空间列)的位置,其经度介于0和1之间,纬度介于38和39之间。

答案 1 :(得分:0)

对于现代数据库,7,000,000行并不多。如果使用索引,则会显着缩短访问时间。拆分表是没有必要的。我已经使用mySQL和大约100万个位置进行了实验,并且没有使用空间扩展,并且对访问时间感到满意(仍然低于1秒)。

您可以这样做:

CREATE INDEX my_idx ON my_pos_table (month,name,lng,lat);

我建议你试一试。没有比经验信息更好的了。还要观察您如何访问数据。也许你并不总是按月和名称访问,所以你可以添加更多的标记,这在插入行时只是一个缺点。

CREATE INDEX my_idx_2 ON my_pos_table (name,lng,lat);    
CREATE INDEX my_idx_3 ON my_pos_table (lng,lat);

希望它有所帮助。

答案 2 :(得分:0)

你可以在这里找到一个有用的帖子:

http://blog.jcole.us/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis/

我已将这篇文章用作超过150万条记录的项目的“起点”-myisam-并且工作正常

顺便说一句,顺便说一下,最好的方法是使用GEOMETRYSPATIAL INDEX - 仅用于myisam,如下所示:

  • ALTER TABLE <table> ADD geom_point GEOMETRY NOT NULL ;
  • ALTER TABLE <table> ADD SPATIAL INDEX geom_point (geom_point) ;
  • UPDATE <table> SET geom_point = POINT(latitude, longitude);

现在,您可以使用如下查询在“方形”中找到所有“名称”:

SELECT * from <table> WHERE 
 MBRContains(GeomFromText('LineString(<lata> <lona>, <latb> <lonb>)'), geom_point)

或者按照距离:

$longitude = 8.449997;
$latitude = 45.550003;
$distance = 50; # km

$point1 = $latitude + $distance / ( 111.1 / cos($latitude));
$point2 = $longitude + $distance / 111.1;
$point3 = $latitude - $distance / ( 111.1 / cos($latitude));
$point4 = $longitude - $distance / 111.1;

SELECT * from <table> WHERE 
 MBRContains(GeomFromText('LineString(<$point1> <$point2>, <$point3> <$point4>)'), geom_point)

试试你的测试表;)