MySQL存储引擎的困境

时间:2011-11-25 18:16:30

标签: php mysql

我想在我的应用程序中使用两个MySQL数据库功能。第一个是全文搜索和交易。

现在,这里的困境是我无法在一个存储引擎中获得此功能。它要么我使用MyIsam(具有FULL-TEXT-SEARCH功能),要么使用InnoDB(支持TRANSACTION功能)。我不能兼得。

我的问题是,无论如何,在我被迫在两个存储引擎之间做出选择之前,我可以在我的应用程序中同时拥有这两个功能。

5 个答案:

答案 0 :(得分:10)

可能的解决方法:

  1. 使用Sphinx或Solr或其他一些外部文本搜索引擎进行文本搜索并使用InnoDB引擎。

  2. 编写您自己的搜索代码 - 并使用InnoDB。这不是一个真正的选择,除非您的搜索需求有限或预算很大。

  3. 使用两个引擎,MyISAM和InnoDB。保留要在MyISAM中进行全文搜索的列,其余的在InnoDB中。这将是有风险的,因为MyISAM中的数据不是交易安全的。

  4. 使用两个引擎,MyISAM和InnoDB。将所有数据保存在InnoDB中,并复制要在MyISAM中进行全文搜索的列。这将需要一些机制(触发器)来进行数据复制。

  5. 等待InnoDB或其他交易引擎支持全文搜索的MySQL版本。

  6. (选项4)但使用具有“崩溃安全”(但仍然不是交易安全)全文索引的MariaDB(MySQL fork):When-will-transactional-fulltext-indexes-be-ready?

  7. 使用其他RDBMS,如PostgreSQL,它在事务引擎中具有全文支持。

答案 1 :(得分:5)

如果您需要对MySQL中的单个表执行事务和全文,您有几个选项。但实际上,从整个讨论中拿走的重点是数据库不擅长开始全文搜索(特别是MySQL!),理想情况下你想将这项工作卸载到一个更好地执行这种类型的组件上任务。

选项1:

创建一个表,您需要以InnoDB的身份执行该事务,然后创建另一个可以对其进行全文搜索的MyISAM“镜像”表。您可以通过使用InnoDB表上的触发器使数据保持同步。一个黑客但它会起作用。

选项3:

查看第三方全文引擎,例如SphinxLuceneSolr。这样,您可以专注于将数据库设计为查询数据时的最佳状态,而不是强制它进行文本搜索。

选项3:

您可以选择使用支持事务和全文搜索的其他数据库服务器,例如SQL Server。

希望这能让你有所了解。

享受!

答案 2 :(得分:3)

MyISAM全文索引可能不如你想象的那么好。它在小数据上运行正常(ish),但在更大的数据上却很糟糕。

在MySQL 5.6中,我们可能在InnoDB上有全文,但它仍然不支持真正的全文搜索引擎所具有的大部分功能。

答案 3 :(得分:2)

没有办法让两者都在同一个数据库引擎中,这些是设计给出的MySQL如何工作的约束。你无法改变物理。 ; - )

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html
http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-transactions.html

当您仍处于设计阶段时,您可能还会考虑为您的项目使用另一个SQL implmentation,它同时支持同一引擎。例如Postgres。

http://wiki.postgresql.org/wiki/Why_PostgreSQL_Instead_of_MySQL_2009#Transactions_and_the_Database_Engine_Core

答案 4 :(得分:1)

另一个选择是使用MySQL的复制支持:

例如,您可以使用InnoDB存储引擎设置主服务器。然后使用MyISAM存储引擎复制到另一个只读服务器。

您可以使用几乎任何MySQL存储引擎,并且在某些用例中可能有一些支持比MyISAM更好的搜索功能。