Mysql Search - 用于全文搜索的 InnoDB 和事务与 MyISAM

Posted

技术标签:

【中文标题】Mysql Search - 用于全文搜索的 InnoDB 和事务与 MyISAM【英文标题】:Mysql Search - InnoDB and transactions vs MyISAM for FULLTEXT search 【发布时间】:2012-02-03 17:59:28 【问题描述】:

我目前正在研究为我的 php 项目提供高级搜索的最佳方法。

我已将范围缩小为使用 FULLTEXT 搜索,而不是使用 LIKE 在表行中查找匹配的字符串。但是,要做到这一点,我似乎需要牺牲使用 InnoDB 引擎,这将使我失去事务和表关系的 ACIDity。

是否真的值得使用 MYISAM mysql 引擎,或者有更好的方法来提供搜索功能。

任何指针将不胜感激!

【问题讨论】:

【参考方案1】:

MySQL 5.6 支持 InnoDB 的 FULLTEXT 索引(2013 年 2 月发布)。见:

http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

【讨论】:

【参考方案2】:

MyISAM 有几个缺点 - 缺乏事务支持、表级锁,这使得它在繁重的读写负载类型中非常慢。 MyISAM 表的另一个不便之处 - 它们不是崩溃安全的,因此在服务器意外关闭或断电的情况下,您可能会丢失一些数据。但是 MyISAM 在某些查询上非常快。

关于全文搜索,我建议使用 InnoDB + Lucene 或 Sphinx 等外部搜索引擎,这样您就可以从安全可靠的存储引擎和快速的全文查询中受益。

有关 InnoDB 和 Sphinx 的快速入门,您可以参考 http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

【讨论】:

【参考方案3】:

这真的取决于应用程序... 将 MyISAM 用于需要参照完整性的任何事情都会立即失败。同时,它的文本搜索并不是所有那么高效。

基本上,有两种方法。如果您发现不需要真正的参照完整性,请考虑使用 NoSQL 数据存储。 MongoDB 是一个很棒的文档存储数据库。

另一方面,如果您确实需要参照完整性,但也需要快速的索引全文搜索,您最好使用Sphinx 或Apache Solr 为全文搜索创建索引缓存.

无论哪种方式,我都认为 MyISAM 是一个遗留数据存储。我不会在新项目中使用它。 YMMV。

【讨论】:

坚持使用 innodb 并执行类似的操作,直到性能成为问题,在这种情况下切换到 sphinx ***.com/questions/4732067/…。如果您认为 myisam 更好,请阅读此***.com/questions/4419499/…

以上是关于Mysql Search - 用于全文搜索的 InnoDB 和事务与 MyISAM的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据检索+查询+全文本搜索

MySQL-中文全文检索

MySQL全文搜索、整理和不间断空格

Django MySql全文搜索有效,但不适用于测试

Elasticsearch 全文搜索和keyword search字段的mapping定义

Elastic Search (ES)