2010-07-20 90 views
0

LIKE是否有替代方案?注意我無法使用FULL TEXT Search。MySQL LIKE替代方案

這是我的mysql代碼。

SELECT * 
FROM question 
WHERE content LIKE '%$search_each%' 
OR title LIKE '%$search_each%' 
OR summary LIKE '%$search_each%' 
+2

你能說出你爲什麼不想使用LIKE?這可能有助於找到解決方案。 – 2010-07-20 06:42:09

+0

在網站搜索中有更有效的方法嗎? – lone 2010-07-20 06:43:44

回答

2

那麼,MySQL有regular expressions,但我想問你,多個LIKE是什麼問題。

我知道它不會很好地擴展,當表得到確實很大,但這對於使用MySQL的人來說很少關注(並不意味着在那裏貶低MySQL,這只是我注意到很多人似乎將它用於小型數據庫,將大型數據庫留給Oracle,DB2或SQLServer(或NoSQL,其中ACID屬性並不那麼重要))。

如果真如你說:

我打算使用它的真正的大網站。

那麼你應該完全避免LIKE。而且,如果您無法使用全文搜索,則需要推出自己的解決方案。

我們以前使用的一種方法是在表上使用insert/update/delete觸發器來填充另一個表。插入/更新觸發應該:

  • 評估所討論的字符串;
  • 把它分成單詞;
  • 扔掉無關緊要的單詞(全數字,噪音詞,如'at','','to'等等);然後
  • 將這些單詞添加到一個表中,該表中標記了原始表中的行。

然後使用該表進行搜索,幾乎可以肯定不是多喜歡快。它基本上是一種自己的全文搜索,您可以在其中精確調整和控制實際應該編入索引的內容。

這樣做的好處是在選擇過程中速度更快,更新過程中成本較低。請記住,對於讀取次數多於寫入次數的表(最常見),這是最好的辦法,因爲它可以分攤索引所有讀取中單個詞的成本。每次閱讀都會產生費用是毫無意義的,只有在數據發生變化時才能做到這一點。

而且,順便說一下,刪除觸發器將簡單地刪除索引表中引用真實記錄的所有條目。

表結構會是這樣的:

Comments: 
    id   int 
    comment  varchar(200) 
    -- others. 
    primary key (id) 

Words: 
    id   int 
    word  varchar(50) 
    primary key (id) 
    index  (word) 

WordsInComments: 
    wordid  int 
    commentid int 
    primary key (wordid,commentid) 
    index  (commentid) 

設置許多一對多關係,ID-ID(即單獨的詞和WordsInComments表),而不是ID文本(它們合併成一個)對於第三範式來說是正確的,但您可能想要考慮將存儲空間換成速度並將其結合起來,前提是您瞭解其含義。

+0

我打算將它用於真正大型的網站。 – lone 2010-07-20 06:44:53

+0

真的很大?像谷歌或像我的當地披薩店? – Tebe 2017-07-06 08:31:18