从数据库中检索(选择)数据的有效方法是什么?

时间:2014-11-30 10:28:33

标签: mysql sql database indexing

在我的数据库中包含大约2百万行。这包含每行句子的集合(非英语)。

    ![Image of database][1]

enter image description here

作为示例,如果用户给出'abcd',则与第1,3行匹配。因此两者都应该选择。 因为数据检索需要花费大量时间。我正在使用以下代码来检索数据。如果任何给定的单词与数据库匹配,则应选择这些行。

        sb.append("SELECT Sentence FROM corpus Where ");
         for(int k=0;k<wordList.size();k++){
             sb.append( " Sentence like '%" + wordList.get(k) + "%' OR ");
         } 
         sb.append(" 1=0");
         rs2 = dbc.sqlExecute(sb.toString());

该选择词可以在行中的任何位置。这可能是前面,中间或结尾。我的问题是当用户给出一些单词短语时,选择匹配的行需要花费大量时间。有没有适当的方法来加速我的数据库检索?我认为索引可能不起作用,因为我不是只搜索行的起点。匹配的单词可能包含行中的任何位置。有效的方法是什么?需要花费大量时间来检索。对我来说是一个巨大的问题。任何人都知道这样做的正确方法吗?

2 个答案:

答案 0 :(得分:0)

你不需要循环,只需这样做:

sb.append("SELECT Sentence FROM corpus Where Sentence like '%");

sb.append(wordList);

sb.append("%'");

答案 1 :(得分:0)

我认为有效的解决方案是使用带有bind参数的PreparedStatement并在循环中执行它。您可以使用For-Each Loop,并为word中的每个wordList绑定参数,然后获取ResultSet(使用try-with-resources)并添加返回的{ {1}}使用类似

sentences {1}}
List

虽然List<String> sentences = new ArrayList<>(); String sql = "SELECT Sentence FROM corpus WHERE Sentence LIKE ?"; PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (String word : wordList) { ps.setString(1, String.format("%%%s%%", word)); try (ResultSet rs = ps.executeQuery()) { sentences.add(rs.getString(1)); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } finally { if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } } 列上的FULLTEXT索引可能是可取的,但此方法可以使用查询缓存并减小查询大小。 Sentence条款只是让情况变得混乱,因为你想要任何匹配的行。您可能还会考虑OR