2011-06-23 33 views
2

我需要爲兩個不同表中的兩個不同列做全文索引。在innodb中使用myisam slave/ghost表進行全文搜索

唯一的問題是我使用innodb,並且我沒有辦法做全文索引。

我知道有一些選項,例如獅身人面像和我看看選項,但我覺得這是一個矯枉過正,因爲colums是全文索引是varchar(20)。

而且,很可能會出現只有約1,000,000行「最多」

一個簡單的選項,我在想是隻有主鍵和使用的MyISAM索引的VARCHAR複製的兩個表。

什麼建議嗎?有什麼辦法可以輕鬆實現嗎?

+0

非規範化,將文本數據放入MyISAM表並將其鏈接到InnoDB表(雖然MyISAM不會強制執行參照完整性)... –

+0

好的第一個問題,好奇的答案,這帶來並歡迎使用stackoverflow。 – stefgosselin

+0

嘿謝謝。雖然反規範化似乎很簡單,有一兩件事我很擔心的是,就像OMG注意參照完整性:沒有交易或F鍵,以確保存儲在MyISAM錶行是理智的,以防止指的是不存在的行搜索結果或相反亦然。 – jjj

回答

1

您的方法似乎正確。

  • 創建一個只包含感興趣的字段(pkey(s)和varchar(s))的新表,引擎myisam。

  • 根據需要在此新表上創建全文索引。

主要的一點是保持這個新表與主表同步。最好的方法是在插入,更新和刪除主表時使用triggers

額外的扭曲是爲了防止最終用戶從與全文索引表篡改。這也可以通過觸發器完成,但還有更好的方法:創建一個db用戶(例如tg_user),並授予他對該表的所有權。然後撤銷除了選擇其他用戶以外的所有內容。並且確保在創建上述觸發器時使用definer條款。

+0

感謝您的安全提示。沒有想到隔離奴臺。 – jjj

0

我決定去用一個簡單的解決方案:

首先,插入該行的InnoDB表(主)。然後,在它之後,將該行插入myisam表(不是觸發器)。

每隔一小時左右運行一次cron以確保參照完整性。

查詢將是這樣的:

SELECT * 
FROM master 
WHERE master.ID NOT IN 
    (SELECT slave.ID FROM slave WHERE master.ID=slave.ID); 

SELECT * 
FROM slave 
WHERE slave.ID NOT IN 
    (SELECT master.ID FROM master WHERE slave.ID=master.ID); 

如果從行指主行不存在,刪除。

如果從行不用於主行存在,請插入。

這不是最好的解決方案,但很簡單。