我正在尝试使用geonames数据库(下载并加载到本地mysql上),使用Java和JDBC驱动程序从一个位置(最低级别是cityname)获取所有相关信息。
我有一个很大的性能问题:每个查询需要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子句的交叉组合......)
表结构与定义的here相同,我没有改变任何内容。 提前感谢所有提示!
答案 0 :(得分: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