我当前遇到了使用许多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万个独特的选择查询,此时它只需要很长时间。
什么是表格结构?你有索引吗?执行查询需要多长时间?如果您在mysqlworkbench中运行查询,请参阅执行计划?结果集有多少条记录? – 2013-02-22 13:16:47
你能澄清什么不起作用吗? (也许你的第二个ResultSet应该被称为'rs2' ...) – vikingsteve 2013-02-22 13:18:55
看到我的答案它将解决你的性能问题。另一种选择应该是从zipcode_addresses中选择min(houseNo),其中zipcode =?' – xagyg 2013-02-22 13:49:49