【问题标题】:How to optimize a wildcard search with an OR in mysql如何在mysql中使用OR优化通配符搜索
【发布时间】:2013-06-03 22:26:21
【问题描述】:

我处于需要进行通配符搜索的情况。全文索引无济于事,因为人们正在搜索单词的一部分,我无法从搜索开始时去掉 % 以加快搜索速度,因为他们可能正在搜索中间部分。

有两个字段需要被搜索,并且应该返回其中任何一个的匹配项。如果我只搜索一个字段,它会非常快(没有很多行),但是当我同时搜索两个字段时,它真的很慢。

我不会详细介绍,但我会给出一个想法,当我有的时候

... 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%')

【问题讨论】:

  • 请显示整个查询(至少 FROM 之后的部分)
  • 你是如何加入 T1 和 T2 的
  • 在 OP 中添加了整个查询

标签: mysql optimization wildcard


【解决方案1】:

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

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

【讨论】:

  • 如果记录有搜索和搜索%,这可以返回重复项
  • UNION 的默认行为是从结果中删除重复的行。使用可选的 ALL 关键字,不会发生重复行删除,结果包括所有 SELECT 语句中的所有匹配行。
  • 哎呀,错字第二次搜索也应该是 %search% 是的,当没有 OR 时,它们都会快速返回。完整的查询有一堆 LEFT JOINS 可能会使 UNION 变得棘手,但我可能会试一试
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 2016-09-06
    • 2019-05-26
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多