2012-02-01 41 views
0

我有1個名爲「關鍵字」的表,其中包含關鍵字列表(可能是短語或單個單詞),其列包括:ID,關鍵字。如何在MySQL中查詢過濾被封鎖的單詞

還有另一個名爲「Blocked」的表格,其中包含應該用於過濾「關鍵字」表格的單詞列表(單個單詞,而非短語)。它的列是:ID,Word。

我想知道一種快捷方式或優化方法,用「關鍵字」表中的關鍵字過濾出「阻止」表中列出的所有關鍵字。

例如,在 「關鍵字」 表,我有這樣的名單:

1 - 朋友在Facebook上

2 - 找朋友

- 與Facebook

3博客4 - 在Facebook上爲朋友做點什麼

5-編程很有趣

這裏是我的名單,以及在 「阻止」 表:

1 - 玩

2 - 朋友

3 - 找到

每當我取來自「關鍵字」表的關鍵字,應該使用「阻止」表中列出的詞進行過濾。因此,在這些列表,如果我從 「關鍵詞」 表中獲取數據,我應該得到這些結果:

2 - 與Facebook博客

5 - 編程是有趣

注意# 1不包含,因爲它包含單詞「朋友」(在「阻止」表中列出)。 #3也不包括在內,因爲它包含「find」。最後,#4不包含,因爲它也包含「朋友」。

我最大的問題是用什麼樣的方法來達到這個目的。請注意,我有大量的關鍵字(約1000萬條記錄)和至少100個被封鎖的單詞。我爲此開發了一個PHP + MySQL解決方案,但它確實很慢。

希望你能給我你的解決方案或建議。

+0

向我們展示您的解決方案並詢問速度如何,比這個龐然大物可能更好 – 2012-02-01 11:50:30

+0

您是否有索引表格?這將顯着提高桌子的表現... – 2012-02-01 11:51:17

回答

1

如果你想要表現,你應該忘記試圖過濾這樣的大表。

您應該創建另一個包含白名單單詞的表格,這是在添加/刪除/編輯黑名單單詞時生成的,並且在需要此過濾器的查詢中使用該表格。當您更新此表時,可能會添加/刪除列出的關鍵字的事件會導致系統開銷。

這樣你就可以避免:

  • 的子查詢使用NOT IN
  • 大循環或array_map /過濾功能

請記住,今天你有100個關鍵字,但明天你就可以有1000個,並且使用除新預過濾結果之外的任何其他方法都會導致性能下降,並且會一直在擴大您所尋找的內容之間的差距。

+0

'NOT IN'可能會有很快的正確指數。 'NOT IN'和'LIKE'%關鍵字%''子查詢將是真正的殺手。 – 2012-02-01 12:07:20

+1

以下是對此主題的有趣測試:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ – sebastiencol 2012-02-01 12:21:25