2010-12-18 95 views
0

我有一個數據庫有兩個表:它們構造如頁面和標籤如下:全文VS ID搜索速度與MySQL

  • 網頁:PAGE_ID,page_text,(在任何時候圍繞60000條記錄)page_tags
  • 標籤:TAG_ID,tag_text
    (約30萬條記錄,在任何時間)

每一頁都與多個標籤(使用page_tags列)相關聯。我的問題是關於pages.page_tags,尤其是哪種方式對於存儲上述關聯最有效?

  1. 一種方式將全文索引page.page_tags和存儲相關的標籤的文字出現,例如:蘋果果粒橙果醬

  2. 第二方法是也全文索引頁。 page_tags但存儲相關聯的標籤的ID,例如:132 14 24192 14

  3. 第三種方式是使第三個表:tag_assoc,結構如下:

tag_assoc:PAGE_ID,TAG_ID

(其中對於存在於網頁中的每個標籤將存在一個記錄與頁面的兩個ID和標籤)


你認爲哪是最高效的方式? 特別是關於:

  • A)搜索速度之類的查詢: 「給我拿把每一個有標籤頁: 蘋果和橘子」
  • B)的表的更新。一個新的 頁面可能經常到達數據庫 。這意味着如果在標籤表中不存在的某些頁面中找到新的 標籤,我將不得不將其添加到標籤表 。

如果他們都不是,你會建議什麼?

+0

感謝你們。兩個答案同樣有幫助,所以我只能接受那個答案更快的答案 – Alexandros 2010-12-19 21:33:21

回答

0

如果您使用全文索引,我會做一些這樣

表1 - 頁

pageid 
name 
date 
category 
... etc etc other page meta data here 

表2 - page_fulltext

pageid 
page_title_fulltext 
page_body_fulltext 

就拿 頁面1有page_body_fulltext「懶狗的快馬虎跳「 第2頁有page_body_fulltext」懶狗的快速紅狐跳「

做全文搜索,你可以找到個人標籤的話,但也找到精確匹配

,即你可以找到關鍵詞「快速」或「褐色」或「狐狸」

但如果有人搜索「快速的棕色狐狸「你也可以做到這一點。

在您的示例中,您可能會查找所有3個單詞並將兩個頁面都返回,這將會出錯。

也是MySQL的處理全文檢索一個偉大的工作,你有什麼建議基本上是一個什麼樣的MySQL會做的非常好了類似的版本了自己

所以在你上面 A)搜索速度列出的2例會很精彩,因爲它本身很好的mysql B)我的方式更快,因爲你不必檢查你插入的每個關鍵字的存在。只需執行標準的更新/插入操作,讓MySQL爲您處理文本搜索的痛苦。

我公司採用我所描述的方法和它的作品非常好...

也是我在單獨的全文列在頁面的文本和網頁標題,你得到的是能夠得分與標題的網頁額外的獎勵包含的關鍵字高於包含相同關鍵字的正文文字的網頁。