我需要加快搜索速度。 目前,我们让用户输入一个名称: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但是在我完成该过程之前还有另一种方法可以实现更快的搜索吗?
答案 0 :(得分:1)
您搜索无法使用任何索引,这就是它变慢的原因。您正在做的是fulltext search,因此请尝试使用现有功能。
一些细节:
您一次又一次地不必要地将term
转换为每行的小写。
你可能从未听说过SQL injection。
可能是的,因为必须传输更少的数据,但更复杂的查询可能是优化器的问题。 Mysql不被认为是最聪明的。无论如何,全文搜索比使用索引要快得多。
您可以尝试使用它来获取所需内容的超集并进一步过滤。
您可以尝试通过创建一个厨房水槽表来模仿它,其中包含所有可通过触发器更新的可搜索文本,但这是相当多的工作,您不会像引擎本身那样快速地获得。