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

标签 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,但在完成该过程之前,是否有另一种方法可以实现更快的搜索?

最佳答案

您的搜索不能使用任何索引,这就是它很慢的原因。你正在做的是 fulltext search ,所以尝试使用现有的功能。

一些细节:

为什么不能使用索引?

  1. 您正在将列值转换为小写
  2. 您正在使用“%”+ ... 进行搜索

您不必要一次又一次地将每一行中的term转换为小写。

您可能从未听说过 SQL injection .

动态 SQL 有帮助吗?

可能是的,因为需要传输的数据更少,但更复杂的查询可能会给优化器带来问题。 Mysql 并不被认为是最聪明的。不管怎样,全文搜索要快得多,因为它使用索引。

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

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

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

关于java - Mysql和Java搜索匹配多列中的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26186258/

相关文章:

mysql - 如何将 varchar 转换为 datetime,不起作用

mysql - 根据插入情况对字符串进行排序

java - 围绕断言语句的迭代器会影响生产构建的性能吗?

java - JPA EclipseLink 数据库异常 : 'table foo.SEQUENCE doesn' t exist'

Java 和 Android 正则表达式的区别

java - 如何使用linkedin api获取公司数据?

java - JUnit测试错误

c# - 在 WPF 中绘制大量可视元素的建议(简单)方法?

java - 将 int 更改为 X 和 Y 方向的最有效方法

java - 使用多少内核的决定权是否掌握在 JVM 手中?