0

我需要组织一个包含 7,000,000 条记录的 Mysql 数据库。它需要可以通过纬度/经度正方形进行查询,例如:22.54x -134.74x。它还需要被month和分解name。大约有 700 个可能的名称。

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

我需要 10,000 多张桌子来应对每一个纬度/经度的可能性吗?然后从那里分解成月份和名称?我的脑子快要爆炸了。

提前感谢您的帮助!

4

3 回答 3

0

MySQL 提供了专门设计用于有效处理 lat/long 类型问题的空间扩展

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

您的查询可以看起来像

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 之间的地点。

于 2012-09-11T04:42:20.787 回答
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);

希望能帮助到你。

于 2012-09-11T05:06:58.313 回答
0

您可以在这里找到有用的帖子:

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

我已将这篇文章用作一个超过 1.5 亿记录的项目的“起点”-myisam- 并且效果很好

顺便说一句,通常最好的方法是使用GEOMETRYand SPATIAL INDEX-only for 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)

试试你的测试台;)

于 2012-09-11T05:28:42.457 回答