搜索文本mysql数据库真的很慢

时间:2013-10-16 21:56:30

标签: java mysql performance

我在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条记录的查询不应该太重。

由于

1 个答案:

答案 0 :(得分:2)

有几件事:

  • PreparedStatement每次都不应该准备好。准备和重复使用。
  • 您的t无处可定。
  • 让DB完成工作:我猜每个DB都有可能处理重复项。对于MySql,有INSERT ... ON DUPLICATE KEY UPDATE ...

所以使用这个命令

INSERT ? INTO records_table ON DUPLICATE KEY UPDATE link = link

部分link = link是一个无操作,可以使MySql解析器的语法看起来很好。

还有INSERT IGNORE更易于使用(不需要无操作),但它忽略了更多问题,这很糟糕。

我忘了提到你需要link上的唯一键约束(主键是英国的一个特例,因此也很好)。