我在mySql上有一个表,有大约300,000条记录。一列是VARCHAR,它包含一个链接(比方说,http://www.mysite.com/123012993)
使用Java,每次创建新记录时我都需要知道它是否已经存在。确切的链接必须在数据库上。如果是新的,则继续插入。否则,什么都不做。
所以我有以下内容:
String selectString = "Select count(link) from records_table where link = ?";
PreparedStatement ps = conn.prepareStatement(selectString);
ps.setString(1, "http://www.mysite.com/123012993");
ResultSet rsFinding = ps.executeQuery();
rsFinding.next();
if (t != 0) return false;
else { // do normal insert }
然而,搜索文本的查询非常慢,我们正在谈论1分钟。插入物本身非常快。一切都在localhost上运行。
这是搜索文本的正确方法吗?或者我应该索引数据库吗?
我正在考虑实现一个hashkey并缩小结果范围,但我认为对300,000条记录的查询不应该太重。
由于
答案 0 :(得分:2)
有几件事:
PreparedStatement
每次都不应该准备好。准备和重复使用。t
无处可定。所以使用这个命令
INSERT ? INTO records_table ON DUPLICATE KEY UPDATE link = link
部分link = link
是一个无操作,可以使MySql解析器的语法看起来很好。
还有INSERT IGNORE
更易于使用(不需要无操作),但它忽略了更多问题,这很糟糕。
我忘了提到你需要link
上的唯一键约束(主键是英国的一个特例,因此也很好)。