0

7,000,000 レコードの Mysql データベースを編成する必要があります。緯度/経度の正方形でクエリ可能である必要があります (例: 22.54x -134.74x)。また、 と で分解する必要がmonthありnameます。約700の可能な名前があります。

namesその緯度/経度の正方形内の誰かがその月と緯度/経度の正方形内に存在するものだけをすばやくクエリできるように、このすべてのデータを管理する方法がわかりません。

緯度/経度の可能性ごとに 10,000 以上のテーブルが必要ですか? そこから月と名前に分解?私の心は爆発しようとしています。

事前にご協力いただきありがとうございます。

4

3 に答える 3

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

MySQL は、緯度/経度タイプの問題を効率的に処理するために特別に設計された空間拡張機能を提供します。

これらの拡張機能を使用すると、特定の行に場所の関連する緯度と経度が含まれ、クエリは関心のある幾何学的境界を記述します。

あなたのクエリは、次の行に沿って何かを見ることができます

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

ここで便利な投稿を見つけることができます:

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

私は、この投稿を 1 億 5000 万件を超えるレコード -myisam- のプロジェクトの「出発点」として使用しましたが、問題なく動作します

ところで、一般的に最善の方法は、次のようにGEOMETRYandSPATIAL 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)

テストテーブルで試してみてください;)

于 2012-09-11T05:28:42.457 に答える