我需要组织一个包含 7,000,000 条记录的 Mysql 数据库。它需要可以通过纬度/经度正方形进行查询,例如:22.54x -134.74x。它还需要被month
和分解name
。大约有 700 个可能的名称。
我不知道如何管理所有这些数据,以便该纬度/经度方块内的某人可以快速查询仅存names
在于该月和纬度/经度方块内的数据。
我需要 10,000 多张桌子来应对每一个纬度/经度的可能性吗?然后从那里分解成月份和名称?我的脑子快要爆炸了。
提前感谢您的帮助!
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 之间的地点。
对于现代数据库,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);
希望能帮助到你。
您可以在这里找到有用的帖子:
http://blog.jcole.us/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis/
我已将这篇文章用作一个超过 1.5 亿记录的项目的“起点”-myisam- 并且效果很好
顺便说一句,通常最好的方法是使用GEOMETRY
and 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)
试试你的测试台;)