我需要组织一个包含7,000,000条记录的Mysql数据库。它需要通过Lat / Long方格查询,例如:22.54x -134.74x。它还需要按month
和name
进行细分。大约有700个可能的名字。
我不知道如何管理所有这些数据,以便该纬度/长方形内的某个人可以快速查询该月内存在的names
和纬度/长方形。
每个纬度/长度可能需要10,000张表吗?然后从那里分解成几个月和名字?我的思绪即将爆发。
提前感谢您的帮助!
答案 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-并且工作正常
顺便说一句,顺便说一下,最好的方法是使用GEOMETRY
和SPATIAL 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)
试试你的测试表;)