Mysql和Java搜索匹配多列中的多个值

时间:2014-10-03 20:23:06

标签: java mysql performance database-performance query-performance

我需要加快搜索速度。 目前,我们让用户输入一个名称:John Doe

然后在Java中我们拆分该字符串以创建多个值(或“术语”)[“John”,“Doe”]并循环遍历所提供的术语,在数据库中执行选择,在多个相关项中查找该术语列:

// For each term in the string[]
SELECT * 
  FROM Person p 
 WHERE 1=1
   AND (p.idNumber = '#{term}'
          OR LOWER(p.firstName) LIKE '%#{term}%'
          OR LOWER(p.lastName) LIKE '%#{term}%' 
          OR LOWER(p.companyName) LIKE '%#{term}%'
          OR p.phone = '#{term}');

在循环结束时,我们使用Java来匹配行的交集,以便所有匹配都是唯一的。

persons = (List<Person>)CollectionUtils.intersection(persons, tmpPersons);

我打算将其更改为动态SQL语句以匹配一个sql语句中提供的所有术语并删除CollectionUtils.intersection但是在我完成该过程之前还有另一种方法可以实现更快的搜索吗?

1 个答案:

答案 0 :(得分:1)

您搜索无法使用任何索引,这就是它变慢的原因。您正在做的是fulltext search,因此请尝试使用现有功能。

一些细节:

为什么不能使用索引?

  1. 您正在将列值转换为小写
  2. 您正在搜索&#39;%&#39; + ...
  3. 您一次又一次地不必要地将term转换为每行的小写。

    你可能从未听说过SQL injection

    动态SQL会有帮助吗?

    可能是的,因为必须传输更少的数据,但更复杂的查询可能是优化器的问题。 Mysql不被认为是最聪明的。无论如何,全文搜索比使用索引要快得多。

    如果全文搜索不能完全满足我的需要怎么办?

    您可以尝试使用它来获取所需内容的超集并进一步过滤。

    您可以尝试通过创建一个厨房水槽表来模仿它,其中包含所有可通过触发器更新的可搜索文本,但这是相当多的工作,您不会像引擎本身那样快速地获得。