Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在检查数据库中是否存在字符串时提高性能_Java_Sql_Database_Performance - Fatal编程技术网

Java 在检查数据库中是否存在字符串时提高性能

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

你有没有办法让我更快地完成这项工作。我将尝试在数据库中找到一个字符串,并向我的对象添加额外的信息。但我必须对1265个对象执行此操作,因此程序运行约80秒。
提前谢谢

打开您选择的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;
            }
        }
    }