什么是优化选择数据库行的方法?

时间:2014-11-29 13:21:33

标签: java mysql sql database

我选择与某些给定值匹配的行。在我的数据库中,内容大约有一百万行。这花费了大量时间来遍历每一行以选择与给定值相同的行。 I列搜索列包含句子集合。原始存储的句子集合。我认为索引可能不适用于我的执行。有没有正确的方法来解决这个问题?

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

以上代码正常工作。问题是读取每一行和匹配行所花费的时间。我可以使用什么样的技术?

3 个答案:

答案 0 :(得分:0)

实现这一目标的最快方法是使用如下所示的REGEX:

WHERE Cor_Sentence REGEXP 'abc|def|geh|ijk'

答案 1 :(得分:0)

我可以想到两种方式

1)在列Cor_Sentence上应用非聚集索引。它肯定会有所帮助。请参阅example

2)如果可能,请进行分页。一次50行

答案 2 :(得分:0)

使用MySQL的全文搜索功能。

为您要搜索的一列或多列添加FULLTEXT索引,然后在布尔模式下使用MATCH...AGAINST来查找结果。

ALTER TABLE corpus ADD FULLTEXT INDEX (Cor_Sentence);

我无法为您提供您需要的Java,但您的查询应如下所示:

SELECT Cor_Sentence FROM corpus WHERE 
    MATCH (Cor_Sentence) AGAINST ('First Second Third' IN BOOLEAN MODE);

其中'First Second Third'是要查找的以空格分隔的单词列表。此查询将选择列表中任何单词出现在搜索列中的行。有些运算符允许您指定某些单词是否必须出现,是否必须出现等等。

你可以在没有全文索引的情况下做到这一点但速度很慢。

注意:您必须使用MyISAM引擎才能使用全文搜索。

MySQL参考是here