【问题标题】:MySQL Full-text Search Workaround for innoDB tablesinnoDB 表的 MySQL 全文搜索解决方法
【发布时间】:2011-02-07 23:36:08
【问题描述】:

我正在设计一个使用 MySQL 作为其后端数据库的内部 Web 应用程序。数据的完整性至关重要,因此我使用innoDB 引擎来实现其外键约束功能。

我想对一种类型的记录进行全文搜索,而这在 innoDB 表中是不支持的。我不愿意转移到MyISAM 表,因为它们缺乏外键支持,而且它们的锁定是按表而不是按行的。

创建一个我需要使用 MyISAM 引擎搜索的记录的镜像表并将其用于全文搜索是否是不好的做法?这样,我只是在搜索数据的副本,如果该数据发生任何事情,这没什么大不了的,因为它总是可以重新创建。

或者这是一种应该避免的尴尬方式?

谢谢。

【问题讨论】:

标签: mysql search innodb myisam full-text-search


【解决方案1】:

我认为这真的很尴尬。也就是说,我的“可能会意外成为生产代码的快速原型”的方法是这样的:

CREATE TEMPORARY TABLE search_mirror (FULLTEXT INDEX (col1, col2, ...)) Engine=MyISAM SELECT * FROM original_innodb_table;

SELECT * FROM search_mirror WHERE MATCH(col1, col2, ...) AGAINST ('foo');

DROP TEMPORARY TABLE search_mirror;

对于奖励积分,您可以在符合您要求的情况下在事务中完成所有这些操作(如果您使用非持久连接并且每次连接仅搜索一次,则可以双倍奖励,因为您可以消除 drop 语句)。

是的,我意识到这不是真正的镜像/复制。是的,我意识到复制表格可能很昂贵(这里的数据集相对较小)。就像我说的,快速而肮脏的原型。 YMMV

【讨论】:

  • 在每个查询中重新创建整个索引会比使用LIKE 搜索更好吗?
【解决方案2】:

您可以创建一个镜像表。这可能不太理想,因为 MyISAM 表不会尊重您的事务(如果事务在 InnoDB 上失败,您在该事务中对 MyISAM 所做的更改仍会出现)。

您可以使用专用的全文搜索系统,例如 Sphinx,这是我用于全文搜索的系统(因为我的数据库是 InnoDB)。

【讨论】:

    【解决方案3】:

    您也许可以使用触发器进行某种数据同步(如果您的 mysql 版本支持它们)。它们允许您在某些点(例如在将数据插入表或从表中删除之后)运行 SQL 的小型 sn-ps。

    例如...

    create trigger TRIGGER_NAME after insert on INNODB_TABLE
    insert into MYISAM_TABLE select * from INNODB_TABLE
    where id = last_insert_id();
    

    ...每当数据插入到 INNODB 表中时,相同的数据会自动插入到 MISAM 表中。

    【讨论】:

    • @Noona JDBC 据我所知与数据库端的触发器没有链接。乍一看,你的解决方案很脏,但效率很高(它不会在每次插入后重新插入所有数据吗?)
    • @AsTeR,不,last_insert_id() 确保它只抓取一行。
    【解决方案4】:

    我觉得这个问题最简单的解决方案是创建一个用于搜索的索引表,并带有一个指向包含真实数据的表的指针。我面临着完全相同的问题,我不想在我的系统中使用 MyISAM 表,因为 InnoDB 表让我高枕无忧。

    所以,我打算解决我的问题是使用 MyISAM 创建一个索引表,这样我就可以只拥有要在其上编制索引的信息。同步将使用触发器完成,这是最简单的方法。我不想复制整个表,因为它会占用大量空间。但是,仅复制所需字段会消耗空间,但会牺牲搜索引擎功能。

    这个索引表可以理解为搜索设施的索引。与任何索引一样,它会占用空间。作为优化,该索引表上插入的数据只能是词条,但这种方式需要额外处理,以便清理无用词进行搜索。

    【讨论】:

      【解决方案5】:

      好消息!在 MySQL 5.6 及更高版本中,全文索引可以与 InnoDB 表一起使用。如果您还没有,您应该考虑将您的 MySQL 更新到 5.6 或更高版本。

      在我的应用程序中,全文搜索非常重要,所以我只使用了 MyISAM。现在,我已将 MySQL 更新到 5.6,将数据库转换为 InnoDB 并添加了正确的约束。最好的麻烦世界。

      MySQL 5.6 Manual - Full-Text Search Functions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        相关资源
        最近更新 更多