2012-10-29 63 views
6

過去幾天這讓我頭疼。我在創建數據庫之前並不知道LIKE的性能。我使用的查詢是這樣的,提高LIKE子句的性能

SELECT .... 
FROM .... JOINS .... 
WHERE tableA.col1 LIKE '%keyword%' OR 
     tableB.col2 LIKE '%keyword%' OR 
     tableC.col2 LIKE '%keyword%' OR 
     ..... 

當我測試的查詢,這是非常快的,因爲當時只有100-150左右就可以了記錄。我想搜索任何包含關鍵字的字符串。數月後,數據庫變得龐大,包含50,000條記錄。而這一次,我已經遇到了查詢的低性能。這是非常低的。

任何建議如何改善它?我不能改變數據庫,因爲它已經被公司使用了。

順便說一句,我的表都是INNODB

+0

這是一個全表掃描...外部搜索引擎怎麼樣? –

+0

也許你的表格佈局需要改變,以避免這種緩慢的查詢。 – Jocelyn

+0

hi @KarolyHorvath。外部搜索引擎是什麼意思? –

回答

1

這種類型的搜索是致電Full Text Search,你真的需要使用專門的系統,而不是強迫數據庫不斷進行表掃描。您可以將所有要搜索的文本大致切換到搜索引擎,然後將其編入索引以進行快速搜索。

一個選項是Apache Lucene

+0

+1而改變,也是另一種選擇:http://sphinxsearch.com/about/sphinx/ –

+0

它將如何應用於我當前的場景?我必須修改我的數據庫的結構還是什麼?我非常需要這個:( – SkyDrive

+0

@DerekFloss Np​​,你會離開你當前的數據庫,相反,你會安裝一個新的軟件tp處理全文搜索,比如Lucene,然後你需要編寫一些代碼來導入所有的你想要搜索到Lucene的文本,然後改變你現有的代碼來使用Lucene進行搜索。 –

1

使用通配符前綴'%abc'很可能會停止使用任何索引。

沒有指數=全表掃描=(通常)慢...

順便說一句,50,000條記錄不是很大;它很小。

您是否考慮過使用MySql的Full-Text Search Functions? (需要MyISAM表)

+1

全文索引只能用於MyISAM表格 –

+0

謝謝。已更新答案。 –

+0

fulltext將不支持'INNODB'? – SkyDrive

0

如果其他朋友提到你不能使用全文搜索,有一個SQL優化點,可以提高查詢:

SELECT .... 
FROM (SELECT * FROM tableA WHERE col1 LIKE '%keyword%') A JOIN 
     (SELECT * FROM tableB WHERE col2 LIKE '%keyword%') B ON ... JOIN 
     (SELECT * FROM tableC WHERE col2 LIKE '%keyword%') C ON ... 

關鍵是要縮小結果集之前的任何加入。