2013-06-03 33 views
-1

我處於需要執行通配符搜索的情況。全文索引沒有任何幫助,因爲人們正在搜索單詞的一部分,而且我無法從搜索開始時去除%,以加快搜索速度,因爲它們可能正在搜索中間部分。如何在mysql中使用OR優化通配符搜索

有兩個字段需要搜索,並且應該返回匹配。如果我只搜索一個字段,它非常快(沒有多少行),但只要我在兩個搜索中搜索都很慢。

我就不贅述了,而是給一個想法,當我有

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

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

它需要0.0695秒

但是當我做

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

it需要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

請出示整個查詢 – Bohemian

+2

你是如何加入T1和T2 – ejrowley

+0

在OP –

回答

1

如果只用第二個條件的查詢(T2.Field1 LIKE「%搜索」)也返回快,你可以嘗試使用UNION來代替:

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

加入這個可返回重複,如果記錄已經搜索和搜索%整個查詢 – BlueConga

+0

工會的默認行爲是(至少從之後的部分)從結果中刪除重複的行。使用可選的ALL關鍵字,不會發生重複行刪除,結果包括所有SELECT語句中的所有匹配行。 – pmorken

+0

Ooops,第二次搜索的錯誤也應該是%search%,並且是的,當沒有OR時,它們都會很快返回。完整的查詢有一堆左連接,可能會使聯盟變得棘手,但我可能會放棄它 –

0

LIKE '%search%'不能縮放,它需要全表掃描,所以隨着表格的增長,搜索速度會變慢。 LIKE 'search%'將使用索引(如果列上存在索引並且速度更快)。