2013-02-22 29 views
0

我当前遇到了使用许多sql select的应用程序的性能问题。许多SQL在java中选择查询的可能性并未找到

编程语言是java,我正在使用mysql数据库。它包含约1000万条记录。 它需要做的是在一个数据库中查找以邮编和门牌号为参数的记录。当它没有找到记录时,它只需要使用邮政编码进行查询,并获得最低门牌号的记录。当在数据库中找不到邮政编码时,应用程序需要处理这个问题。

因此做单查询的代码如下所示:

Statement select = "select * from zipcode_addresses where zipcode = ? and houseNo =?"; 
ResultSet rs = select.executeQuery(); 
if(rs.next()) { 
    dealWithResult(rs); 
} 
else { 
    Statement alternativeSelect = "select * from zipcode_addresses where zipcode = ? group by houseNo having min(houseNo)"; 
    ResultSet rs = alternativeSelect.executeQuery(); 
    if(rs.next()) { 
     dealWithResult(rs); 
    } else { 
     System.err.println("Could not find zipcode :" + zipcode); 
    } 
} 

是否有这样做与不被发现的数据涉及批次选择查询的正确方法?

谢谢!

更新

表结构如下:

+-----------------+-------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+-----------------+-------------+------+-----+---------+-------+ 
| zipcode   | varchar(6) | NO | PRI | NULL |  | 
| house_no  | int(11)  | NO | PRI | NULL |  | 
| sanddcode  | varchar(45) | NO |  | NULL |  | 
| depot   | varchar(3) | NO |  | NULL |  | 
| network_point | varchar(6) | NO |  | NULL |  | 
| region   | varchar(3) | NO |  | NULL |  | 
| seq    | int(11)  | NO |  | NULL |  | 
| cluster_id  | varchar(1) | NO |  | NULL |  | 
| strand_id  | int(11)  | NO |  | NULL |  | 
| strand_props_id | int(11)  | NO |  | NULL |  | 
| version_id  | int(11)  | NO | PRI | NULL |  | 
+-----------------+-------------+------+-----+---------+-------+ 

的版本号,邮编和house_no 指数上的邮编和house_no和邮政编码另一个索引主键,无论是使用BTREE索引。

该应用程序有时可能用于执行100万个独特的选择查询,此时它只需要很长时间。

+0

什么是表格结构?你有索引吗?执行查询需要多长时间?如果您在mysqlworkbench中运行查询,请参阅执行计划?结果集有多少条记录? – 2013-02-22 13:16:47

+0

你能澄清什么不起作用吗? (也许你的第二个ResultSet应该被称为'rs2' ...) – vikingsteve 2013-02-22 13:18:55

+0

看到我的答案它将解决你的性能问题。另一种选择应该是从zipcode_addresses中选择min(houseNo),其中zipcode =?' – xagyg 2013-02-22 13:49:49

回答

0

您可以使用两个参数创建一个存储过程,并使用House Number作为可选项,或者让程序找到存在或不存在。

0

很大程度上取决于使用模式。您运行多少个查询,多少次出现邮政编码错误等等。首先,我将使用PreparedStatements,其中可能的位置。我对MySQL并不熟悉,但它们通常被连接数据库缓存和重用,这对性能有帮助。接下来,如果邮政编码缺失是常见的,我可能会建立一个邮政编码的内存缓存来短路,在未命中时执行3个查询。之后,我可以制作一个ZIP +房号的视图。进一步取决于你的应用如何工作,但这些事情会有所帮助。

0

第二次SQL查询中的“group by”是不必要的,并且会导致性能下降。为了获得最佳性能,更换此选择(在你的代码中的第二个)...

select * from zipcode_addresses where zipcode = ? 
    group by houseNo having min(houseNo) 

这... ...

select min(houseNo) from zipcode_addresses where zipcode = ? 

另外,还要确保你有邮政编码+的HouseNo索引(其它看起来像你 - 从更新后的帖子)。