Java 搜索文本mysql数据库的速度非常慢

Java 搜索文本mysql数据库的速度非常慢,java,mysql,performance,Java,Mysql,Performance,我在mySql上有一个表,大约有300000条记录。一列是VARCHAR,它包含一个链接(比如,) 使用Java,每次创建新记录时,我都需要知道它是否已经存在。确切的链接必须在数据库上。如果是新的,则继续插入。否则,什么也不做 因此,我有以下几点: String selectString = "Select count(link) from records_table where link = ?"; PreparedStatement ps = conn.prepareStat

我在mySql上有一个表,大约有300000条记录。一列是VARCHAR,它包含一个链接(比如,)

使用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分钟左右。插入本身非常快。一切都在本地主机上运行

这是搜索文本的正确方法吗?还是应该为数据库编制索引

我在考虑实现一个hashkey并缩小结果范围,但我相信对300000条记录的查询应该不会太重

谢谢你做了几件事:

  • PreparedStatement
    不应一次又一次地准备。准备并重复使用
  • 您的
    t
    没有定义
  • 让数据库来做这项工作:我想每个数据库都有可能处理重复的数据。对于MySql,有
所以使用这个命令

插入?进入重复键更新链接上的记录表=链接

部分
link=link
是一个no-op,可以使MySql解析器的语法看起来很好

还有一个
INSERT IGNORE
,它更容易使用(不需要no-op),但是它忽略了更多的问题,这是不好的


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

索引会有所帮助。自己构建散列没有多大意义,因为索引已经在后台完成了这项工作(有些)。对于不是批量结果表扫描的任何内容,在大多数情况下都应该使用索引进行查找。另一个选项是始终尝试插入并在
链接上添加唯一约束。当存在重复项时,您可以捕获并忽略insert抛出的
SQLException
。@samlewis:太脏了。SQLException相当愚蠢,您无法判断插入是否失败或连接是否中断或其他情况。解析消息太脆弱。我创建了索引,不幸的是性能没有变化。我知道这不是服务器的问题,因为我看到服务器的利用率和CPU是30%,RAM是一样的。很好,很好的建议大家@Maaartinux是的,你是对的,有一些语义错误,我从代码中复制了它,但我很高兴你得到了一般的想法。现在我需要处理惟一约束,因为我的链接列被定义为VARCHAR(1000),并且它只适用于最多255个字段。如果您真的需要这么长的列,那么创建另一个用作UK的列,并在其中存储一个校验和(MD5应该可以)。或
添加唯一键(链接(200),链接校验和)
。前一部分使其排序(忽略第200列后面的内容),而后一部分使其工作。我已将链接字段定义为唯一字段。但是,它不是主键(还有一个id字段)。使用ON DUPLICATE KEY UPDATE,我如何确保您正在比较的字段是LINK,而不是if ID?所有约束都会被检查,所以它会工作(假设ID是自动生成的,它不会冲突,所以唯一的冲突可能来自
链接
)。是的,mySql会检查所有约束。谢谢,这帮了大忙。