2011-06-23 35 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); 

如果从行指主行不存在,删除。

如果从行不用于主行存在,请插入。

这不是最好的解决方案,但很简单。