2

我正在尝试使用geonames数据库(在本地 mysql 上下载并加载)使用 Java 和 JDBC 驱动程序从某个位置(最低级别是城市名称)获取所有相关信息。

我有一个很大的性能问题:每个查询大约需要 4-5 秒,我必须将查询分成三部分,然后才能获得我需要的所有结果。

基本上,我已经加载了 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 名称,我必须启动两个新查询:

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 + "';";

我确信可以将两个查询组合成一个(但不太确定),但我不知道如何创建 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 回答