我需要加快搜索速度。 目前我们让用户输入一个名字: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 ,所以尝试使用现有的功能。
一些细节:
为什么不能使用索引?
- 您正在将列值转换为小写
- 您正在使用“%”+ ... 进行搜索
您不必要一次又一次地将每一行中的term
转换为小写。
您可能从未听说过 SQL injection .
动态 SQL 有帮助吗?
可能是的,因为需要传输的数据更少,但更复杂的查询可能会给优化器带来问题。 Mysql 并不被认为是最聪明的。不管怎样,全文搜索要快得多,因为它使用索引。
如果全文搜索不能完全满足我的需要怎么办?
您可以尝试使用它来获取您想要的内容的超集并进一步过滤。
您可以尝试通过创建一个厨房水槽表来模仿它,其中包含所有可搜索文本,这些文本将由触发器更新,但这需要相当多的工作,而且您不会像引擎本身那样快。
关于java - Mysql和Java搜索匹配多列中的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26186258/