2014-09-27 68 views
0

我正在爲擁有一家招聘公司的朋友建立一個IT候選人數據庫。他有一個數以千計的候選人目前在Excel電子表格中的數據庫,我將它轉換成mySQL數據庫。我的數據庫設計的搜索速度會慢嗎?

每個候選人都有一個技能領域,其技能被列爲一個字符串,例如, 「javascript,php,nodejs ...」等

我的朋友會有他下面的員工也會搜索數據庫,但是我們要這樣做,所以他們只限於搜索結果與具有特定技能的候選人取決於他們出於安全原因正在處理什麼空缺(所以他們不會竊取數據庫的大部分內容,並且利用這些數據去建立他們自己的招聘公司)。

因此,如果員工正在處理JavaScript角色,他們將被限制爲候選人在他們的技能字段中包含單詞「javascript」的搜索結果。因此,如果他們搜索所有名爲「Michael」的候選人,那麼它只會返回帶有JavaScript技能的「Michaels」。

我擔心的是,搜索可能需要很長時間,因爲它必須掃描技能字段,有時可能是一個很長的字符串。

我的擔心是否合理?如果是的話,是否有一種方法來優化呢?

+1

這將是緩慢的,除非你正常化技能到一個單獨的表,雖然全文搜索可以幫助緩解....但你沒有曾經在你的設計描述中提到這個詞索引 – 2014-09-27 14:33:44

+0

我以前有一個對話與我的朋友和他說,爲應聘者選擇的預設技能列表在設計上太麻煩,因爲技能太多,而且他們在不斷變化。 – dlofrodloh 2014-09-27 14:39:36

+0

這並不意味着你不能規範化你的數據庫....交叉引用不需要手動維護,但可以修改,以添加新的技能,當一個新的CV輸入系統 – 2014-09-27 14:47:31

回答

1

如果記錄的數量是幾千,那麼您可能不會遇到任何速度問題(只要確保不會比您應該查詢的次數多)。

你已經用'mysql'標籤標記了這個問題,所以我假設這就是你正在使用的數據庫。確保你添加了一個FULLTEXT index來加速搜索。但請注意,這種類型的索引僅適用於從MySQL 5.6開始的INNODB表。

先嚐試內置搜索,但如果發現它太慢,或者結果不夠準確,可以查看外部全文搜索引擎。我個人對Sphinx search server擁有非常好的體驗,它可以輕鬆索引數百萬條文本記錄並返回良好結果。

1

您的查詢需要全表掃描(除非您使用全文索引)。我強烈建議您通過引入兩個表來更改數據庫中的數據結構:SkillsCandidateSkills

第一是可用的技能列表,包含的行如:

SkillId SkillName 
     1 javascript 
     2 php 
     3 nodejs 

第二個會說每個人都有哪些技能:

CandidateId SkillId 
    1   1 
    2   1 
    2   2 

這將加快搜索,但這不是主要原因。主要原因是修復問題並啓用功能,例如:

  • 防止搜索列表中的拼寫錯誤。
  • 提供啓用同義詞搜索的基礎。
  • 確保思考進入添加新技能(因爲他們需要被添加到Skills表。
  • 允許數據庫擴展。

如果您嘗試使用全文索引來做你想做的事,你會學到一些東西。例如,默認的最小字長度是4,如果您的技能包括「C」或「C++」,則這會成爲問題。 MySQL不支持同義詞,所以你必須仔細研究才能獲得該功能。而且,如果你有多個單詞的技能,你可能會得到意想不到的結果。