Java 在检查数据库中是否存在字符串时提高性能
你有没有办法让我更快地完成这项工作。我将尝试在数据库中找到一个字符串,并向我的对象添加额外的信息。但我必须对1265个对象执行此操作,因此程序运行约80秒。Java 在检查数据库中是否存在字符串时提高性能,java,sql,database,performance,Java,Sql,Database,Performance,你有没有办法让我更快地完成这项工作。我将尝试在数据库中找到一个字符串,并向我的对象添加额外的信息。但我必须对1265个对象执行此操作,因此程序运行约80秒。 提前谢谢 打开您选择的DB客户端,例如HeidiSQL,然后执行 ps = (PreparedStatement) connection.prepareStatement( "SELECT nm.id, nid.key, nm.name, nm.languageCode FROM odds.name as nm JOIN (od
提前谢谢 打开您选择的DB客户端,例如HeidiSQL,然后执行
ps = (PreparedStatement) connection.prepareStatement(
"SELECT nm.id, nid.key, nm.name, nm.languageCode FROM odds.name as nm JOIN (odds.name_id as nid)\r\n"
+ "ON (nm.id = nid.id) where nm.name like '%' and nid.key not like \"vhc%\" and nid.key not like \"vdr%\" and nid.key not like \"vto%\" and nid.key not like \"vbl%\"\r\n"
+ "and nid.key not like \"vf%\" and nid.key not like \"vfl%\" and nid.key not like \"vsm%\" and nid.key not like \"rgs%\"\r\n"
+ "and nid.key not like \"srrgs%\" and nm.typeId=8 and nm.sourceId=-1 and nm.languageCode = 'en'");
for(Entry <String, Tag> e : allTags.entrySet()) {
ResultSet rs = ps.executeQuery();
while(rs.next()) {
if(rs.getString("name").equals(e.getValue().getTranslation(Language.EN))) {
e.getValue().setAlternativeKey(rs.getString("name"));
break;
}
}
}
);
通过这种方式,MySQL向您解释了在尝试创建结果时它在做什么,以及在哪里浪费了时间
从那里,您可以继续创建索引或更改查询以利用现有索引
顺便说一句:
看起来很奇怪。那是一种变体吗
nm.name like '%'
后者可能更快。如果其他like语句中的文本始终相同,则在插入数据时检查这些条件,添加int或boolean类型的列,并将此检查的结果保存为文本本身之外的整数/布尔值,可以获得更好的性能。与文本搜索相比,检查固定数值要快得多。首先,在解决性能问题时,为自己准备一个分析工具,告诉您在哪里花费时间,调用给定方法的频率等等 但我认为情况已经足够清楚,可以给出一些更具体的提示 您一遍又一遍地执行PreparedStatement,对allTags.entrySet中的每个条目执行一次,始终给出相同的结果,并且在软件内部筛选出您感兴趣的行。你做了1265次同样的查询,对吗 这让我很困惑你在Whiler里做什么。下一个循环。实际上,在引入一些局部变量、将常量值移出循环后,代码会执行以下操作:
is not null
因此,查询结果的唯一作用似乎是决定如果标记的翻译在ResultSet中显示为name,是否应设置替换键-该值已由方法调用getTranslationLanguage.EN的结果固定,与任何数据库结果无关
我建议执行一次查询,收集HashSet names中的name值,然后执行allTags循环设置翻译(如果翻译包含在名称集中)。这应该会得到与代码相同的结果,而且速度可能会快得多。因为LIKE语句执行模式匹配,所以可能会很昂贵。将所有使用3个字符加上百分比的模式的相似项减少为:substrnid.key,1,3不在vhc、vdr、vto、vbl、vfl、vsm、rgs中
is not null
for(Entry <String, Tag> e : allTags.entrySet()) {
Tag tag = e.getValue();
String translation = tag.getTranslation(Language.EN);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
if(rs.getString("name").equals(translation)) {
tag.setAlternativeKey(translation);
break;
}
}
}