如何在mysql中使用OR优化通配符搜索

时间:2013-06-03 22:26:22

标签: mysql optimization wildcard

我处于需要进行通配符搜索的情况。全文索引没有帮助,因为人们正在搜索单词的一部分,我无法从搜索开始剥离%以加快它,因为他们可能正在搜索中间部分。

需要搜索两个字段,并且应返回其中一个匹配项。如果我只搜索一个字段,那么它很快(行数不多)但是一旦我搜索它们就会很慢。

我不会详细说明,但是当我有

时,我会提出一个想法
... AND (T1.Field1 LIKE '%search%')

... AND (T2.Field1 LIKE '%search%')

需要0.0695秒

但是当我做的时候

... AND (T1.Field1 LIKE '%search%' OR T2.Field1 LIKE '%search%')

需要35秒

如何优化这个以及为什么OR会增加搜索时间?

按要求提供完整的未经编辑的查询:

SELECT CDR.Status AS CDRStatus, D.VendorID, D.RevisionOfID, D.Revision, D.DocumentID, D.Title, D.OriginalFilename 
FROM Documents AS D
LEFT JOIN CompanyDocumentReviews AS CDR ON CDR.DocumentID = D.DocumentID
LEFT JOIN Vendors AS V ON V.VendorID = D.VendorID
LEFT JOIN VendorAliases AS VA ON VA.Vendor1ID = V.VendorID AND VA.Vendor2ID != V.VendorID
LEFT JOIN Vendors AS V2 ON V2.VendorID = VA.Vendor2ID
WHERE D.Status != 'Deleted' AND (V1.VendorName LIKE '%search%' OR V2.VendorName LIKE '%search%')

2 个答案:

答案 0 :(得分:1)

如果只有第二个条件的查询(T2.Field1 LIKE'%search')也快速返回,您可以尝试使用UNION:

(SELECT ... AND (T1.Field1 LIKE '%search%'))
UNION
(SELECT ... AND (T2.Field1 LIKE '%search'))

答案 1 :(得分:0)

LIKE '%search%'无法扩展,需要进行全表扫描,因此随着表的增长,搜索速度会变慢。如果列中存在索引,LIKE 'search%'将使用索引,并且速度会快得多。