【问题标题】:Full text searching in innodb using a myisam slave/ghost table使用 myisam slave/ghost 表在 innodb 中进行全文搜索
【发布时间】:2011-09-20 22:33:20
【问题描述】:

我需要对两个不同表中的两个不同列进行全文索引。

唯一的问题是我使用的是innodb,无法进行全文索引。

我知道有诸如 sphinx 之类的选项,我查看了这些选项,但我觉得这有点矫枉过正,因为要全文索引的列是 varchar(20)。

而且,可能“最多”只有大约 1,000,000 行

我认为的一个简单选项是仅使用主键和要使用 myisam 索引的 varchar 复制两个表。

有什么建议吗?有什么方法可以轻松实现吗?

【问题讨论】:

  • 非规范化,将文本数据放在 MyISAM 表中并将其链接到 InnoDB 表(尽管 MyISAM 不会强制引用完整性)...
  • 第一个问题很好,很好奇这带来的答案,欢迎来到 stackoverflow。
  • 嘿,谢谢。虽然非规范化看起来很简单,但我担心的一件事是参照完整性,就像 OMG 指出的那样:没有事务或 f 键来确保存储在 myisam 表中的行是正常的,以防止搜索结果引用不存在的行反之亦然。

标签: mysql indexing innodb myisam


【解决方案1】:

我决定采用一个简单的解决方案:

首先,将行插入到 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);

如果从行引用不存在的主行,则删除。

如果主行不存在从行,则插入。

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

【讨论】:

    【解决方案2】:

    您的方法似乎是正确的。

    • 创建一个新表,其中仅包含感兴趣的字段(感兴趣的 pkey(s) 和 varchar(s))引擎 myisam。

    • 根据需要在这个新表上创建一个全文索引。

    主要的变化是让这个新表与主表保持同步。最好的方法是在主表的插入、更新和删除时使用triggers

    另外一个转折是防止最终用户篡改全文索引表。这也可以通过触发器来完成,但有更好的方法:创建一个 db 用户(例如 tg_user),并授予他该表的所有权。然后将除选择之外的所有内容都撤消给其他用户。并确保在创建上述触发器时使用definer 子句。

    【讨论】:

    • 感谢您的安全提示。没想到隔离从表。
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多