2011-06-20 78 views
1

我有這個疑問在MySQL:如何提高「like」%variable%'「中的性能?

select * 
from alias where 
name like '%jandro%'; 

哪個結果是:

Jandro, Alejandro 

上名的索引不能使用,因爲它是一個範圍過濾器適用於更高的性能。 有沒有改善查詢性能的方法?

我試過用全文索引,但它只適用於完整的單詞。

我也試過用MEMORY ENGINE表,它速度更快,但我想要一個更好的選擇。

編輯
我想我會剛剛接受這個現在:

select * 
from alias where match(name) against ('jandro*' in boolean mode); 
+1

「內存引擎」速度更快,因爲整個表(僅)存在於RAM中。如果您關閉數據庫服務器或計算機,則該表爲GONE。如果你在其他地方(另一個表,非內存),但是確實知道你的數據不是永久的,這可能沒問題! – Konerak

+0

謝謝。我知道。這只是內存中的一個非規範化表格,用於快速查找! :-) –

+0

好的,很好,你知道,但我會留下評論,以便尋找解決方案的下一個人不使用'魔術記憶引擎'並認爲他的問題已經解決;) – Konerak

回答

2

我已經在過去(不是MySQL和之前全文搜索做,這是常用的上數據庫服務器)通過創建一個查找表,其中我創建了所有左斬子串來搜索。

就我而言,這是值得的 - 一個關鍵的用戶旅程,包括搜索名稱的方式與您建議的方式非常相似,並且性能非常關鍵。

它在插入,更新和刪除觸發器上工作。

翻譯成你的例子:

表別名

ID   name 
1   Jandro 
2   Alejandro 

表name_lookup

alias_id   name_substring 
1     Jandro 
1     andro 
1     ndro 
1     dro 
1     ro 
2     Alejandro 
2     lejandro 
2     ejandro 
2     jandro 
2     andro 
2     ndro 
2     dro 
2     ro 

然後將查詢變得

select alias_id, name 
from alias a, 
    name_lookup nl 
where a.id = ni.alias_id 
and ni.name_substring like 'andro%' 

這樣,你打的name_substring表上的dex。

這對於處理大量數據集的常見查詢是唯一值得做的事 - 但它很有效,而且很快。