2

geonamesデータベース (ダウンロードしてローカル mysql にロード) を使用して、Java および JDBC ドライバーを使用して場所 (最下位レベルは都市名) からすべての関連情報を取得しようとしています。

パフォーマンスに大きな問題があります。各クエリには 4 ~ 5 秒ほどかかり、必要なすべての結果を取得する前に、クエリを 3 つの部分に分割する必要があります。

基本的に、allCountries データベース、admin1codes、および admin2codes をロードしました。admin1 と admin2 の一意の ID は、すべての国のクエリから取得された情報によって構成されているため、データベースをクエリするには、次のようなことを行う必要がありました。

String query = "SELECT DISTINCT "
             + "loc_geoname.name AS name,"
             + "loc_geoname.asciiname AS asciiname,"
             + "loc_geoname.alternatenames AS alternames,"
             + "loc_geoname.latitude AS latitude,"
             + "loc_geoname.longitude AS longitude,"
             + "loc_geoname.country AS country_code,"
             + "loc_geoname.admin1 AS admin1, "
             + "loc_geoname.admin2 AS admin2, "
             + "loc_countryinfo.name AS country, "
             + "loc_countryinfo.currency AS value "
             + "FROM loc_geoname, loc_countryinfo "
             + "WHERE loc_countryinfo.iso_alpha2=loc_geoname.country "
             + "AND loc_geoname.asciiname IN (" + search + ") "
             + "AND loc_geoname.country='" + countrycode + "' "
             + "AND loc_geoname.fcode like 'PP%' limit 10;"

これは、都市のすべての情報を取得するために使用しているクエリです (検索と国コードは事前に作成された文字列であり、重要ではありません)

ここで、admin1 名と admin2 名を取得するには、2 つの新しいクエリを起動する必要があります。

String a1 = res.getString("admin1");
String query_area = "select name from loc_admin1Codes where code='" + countrycode + "." + a1 + "';";

String a2 = res.getString("admin2");
String query_district = "select name from loc_admin2Codes where code='" + countrycode + "." + a1 + "." + a2 + "';";

2 つのクエリを 1 つに結合することは可能だと確信していますが (あまり確信はありません)、最初のクエリから値を取得して文字列を 2 番目と 3 番目のクエリに結合することなく、admin1 と admin2 のコードを作成する方法がわかりません。 .

また、最初のクエリを改善して少し高速化できると確信しています(where句とのクロスコンビネーションの代わりに結合を使用する可能性があります...)

テーブル構造はここで定義されているものと同じで、そこから何も変更していません。ヒントを事前にありがとう!

4

1 に答える 1

4

毎回リクエストする必要はありません。

これを行うには、列「admin1Nameé」と「admin2Name」を追加し、それらの値を単純な SQL クエリで更新しました。

このデータベースは非常に大きいため、計算列について考える必要があります。

編集:それでも毎回やりたい場合

SELECT 
    locgeoname.*, 
    loc_countryinfo.name, loc_admin1Codes.name, loc_admin2Codes.name, 
FROM 
    loc_geoname 
INNER JOIN 
    loc_countryinfo ON loc_countryinfo.iso_alpha2 = loc_geoname.country
INNER JOIN 
    loc_admin1Codes ON code = loc_countryinfo.iso_alpha2 + '.' + admin1  
INNER JOIN 
    loc_admin2Codes ON code = loc_countryinfo.iso_alpha2 + '.' + admin1 + '.' + admin2
于 2011-09-06T12:31:53.400 に答える