2009-11-21 82 views
1

在我的MySQL的一個表,我有以下欄目:提高搜索性能

Skills  varchar(80) 
Industry varchar(40) 
Address  varchar(100) 

技能可能包括像文本:C/C++微軟Office的Linux等 行業可能包括以下文本:財務,IT等 地址包含完整的郵政地址以及城市名稱。沒有單獨的城市列。

在我的網頁上我有搜索框,用戶可以在其中鍵入每個列的關鍵字。我使用SQL查詢如下:

Select studentname where skills like '%...%'; 

我想改善搜索結果以及性能。例如,用戶可能已經輸入了技能,如Linex而不是Linux。所以,我的搜索應該返回約。比賽。

請讓我知道如何讓搜索更精確並提高性能。目前,我已在skillsaddressindustry列中定義了索引。但表現不是很好。

表引擎是InnoDB。

編輯

的問題是,我們收到來自不同機構的預充MS Excel表。我們的.NET應用程序讀取Excel工作表的列值並將其存儲在遠程數據庫中。對於拆分表格,我們需要在應用程序中進行更改。

回答

9

的SQL子句

like '%...%' 

是,如果你願意,你可以做的最破壞性的事來自數據庫的性能。

你真正應該做的是確保諸如技能,行業等等的東西被分解到其他表中,其中固定爲值(如'C','C++','SQL'等等)。

然後在人與技能之間有一個多對多的表格。例如:

People: 
    PersonId primary key. 
    Other person details. 
Skills: 
    SkillId primary key. 
    SkillName. 
    Other skill details. 
PeopleSkills: 
    PersonId references People(PersonId). 
    SkillId references Skills(SkillId). 
    primary key (PersonId,SkillId). 
    index on (SkillId). 

這種佈局都將提高查詢的速度大規模做出不正確的數據錄入不可能的,如果你只允許從技能表搜索項的條目(沒有「期Linex」可能在那裏你的意思是'Linux',只是因爲'Linex'不在技能列表中)。

我遵循表設計的一個無懈可擊的規則是:如果您嘗試從列內提取一些信息,則應將該信息放入其自己的列中。由於他們創建了帶有逗號分隔值的單列(他們想要從該列中提取單個值)的表格,人們所遭受的性能問題的數量應該證明這一點。

必須確保所有技能和行業都在一個單獨的表格中的缺點將不僅僅是通過提高速度和準確性來彌補。數據庫應該是總是設計爲第三範式。如果您瞭解其後果(並通過使用觸發器或計算列來減少不正確數據的可能性),則可以將其歸結爲2NF,但這很少需要。

4

我建議你使用全文搜索與指數。 InnoDB的不支持全文,但你可以使用外部引擎如Apache Lucene的,在Zend_Search_Lucene(PHP)等

0

獨立的技能,只是一個表,然後使用該ID連接到您的當前表,有的像這樣:

Skills: Id, Name 
Skills_YourTable: Skills_Id, YouTable_Id 
YouTable: Id, another fields. 

EX:

Select y.fields 
from YourTable as y 
    join Skills_YourTable as sy 
    join Skills as s 
where s.Name = 'MS Office' 
0

由於其他海報提到規範化您的數據庫第一。

爲了對付搜索時拼寫錯誤,看看SOUNDS LIKE

1

另一種解決方案是使用不同的搜索技術。看看Zend Search Lucene框架。這是基於JAVA版本的Lucene。

它有更好的搜索內容的方式。您可以搜索單個單詞,短語,範圍,模糊,接近度,提升,突出顯示等。

但是,您的搜索內容需要以平面文件形式存儲在數據庫中,並且您需要保持內容同步。但是,這表示搜索的力量是值得的。它也很快,速度非常快。

Google:php lucene zend獲取更多信息。

Also see this for a great tutorial