对于论坛,我应该将MyISAM或InnoDB用于存储文本的表吗?
我知道MyISAM支持全文搜索,这听起来像是我应该去做的,但在阅读时,我遇到了这个非常令人困惑的句子。
你应该在什么时候使用InnoDB 交易很重要,比如 对于插入和插入的情况 SELECT正在交错,例如 在线留言板或论坛。
嗯,但是对于“在线留言板或论坛”,我需要很好的搜索来搜索每个帖子的文本,所以使用MyISAM更有意义吗?有人可以澄清什么是最常用的吗?
答案 0 :(得分:3)
除了MySQL的原生全文搜索解决方案,您已经确定需要MyISAM存储引擎,您可能还需要考虑受欢迎的第三方搜索引擎Sphinx和Apache Lucene,你可以使用InnoDB表。
你也可以坚持使用MySQL的解决方案,并为所有表使用InnoDB存储,除了一个只保留post_id
和text_body
的表。这假设您只需要全文搜索论坛帖子的内容。
另外请注意,尽管MyISAM的主要缺点是缺乏交易支持,但生产系统还存在其他重要问题。您可能需要查看以下文章以供进一步阅读:
答案 1 :(得分:1)
对于任何大量的文本,我都会使用InnoDB来存储它,并使用Sphinx来索引它。它提供了比mysql内置更多的搜索功能。
答案 2 :(得分:1)
一般来说,对于非关键数据,我会使用InnoDB来调整速度。 (例如,我不会在每次提交时刷新二进制日志。)我只使用MyISAM来记录表。
正如其他人所提到的,如果您需要进行全文搜索,可以使用外部搜索索引。它们比MySQL更强大,更快。
关于交易的部分,这有点谎言。您可以通过锁定WRITE表来使用MyISAM执行相同的操作。如果您在发布消息时插入三个表,则可以将所有三个表锁定为WRITE,并且数据看起来一致(假设所有三个INSERTS都成功)。
但问题是你要锁定整个表,这会降低并发使用的速度。事实上,这是InnoDB相对于MyISAM的主要优势之一:它具有行级锁定功能。
简而言之:如果您无法设置外部索引器,并且您的网站没有经历过多流量,那么尽管MyISAM不太健壮,它仍能正常工作。您可以使用表锁来模拟事务的一致性。 (我的意思是让它看起来像表锁定在某种程度上等同于事务。)
否则,我会使用InnoDB和外部索引服务。