全文searchInnoDB

我正在开发一个高容量的Web应用程序,其中一部分是讨论post的MySQL数据库,需要顺利地增长到20M +行。

我原本打算使用MyISAM作为表格(用于内置的全文searchfunction ),但是由于一次写入操作而使整个表格被locking的想法使我快门。 行级锁更有意义(更不用说InnoDB在处理大型表时的其他速度优势了)。 所以,因为这个原因,我决定使用InnoDB。

问题是… InnoDB没有内置的全文searchfunction。

我应该使用第三方search系统吗? 像Lucene(C ++) / 狮身人面像 ? 你们有没有数据库忍者有任何build议/指导? LinkedIn的zoie (基于Lucene)目前看起来是最好的select …是围绕实时function而build立的(这对于我的应用程序来说是相当重要的)。我有点犹豫,没有一点洞察力就犯下了……

(仅供参考:将使用高内存钻台上的EC2,使用PHP来为前端服务)

我可以保证MyISAM全文是一个糟糕的select – 即使抛开MyISAM表格的各种问题,我已经看到全文内容会消失,并开始破坏自己,并定期崩溃MySQL。

一个专门的search引擎肯定会成为最灵活的select – 将发布数据存储在MySQL / innodb中,然后将文本导出到您的search引擎。 您可以非常容易地设置定期的完整索引构build/发布,并且如果您觉得需要并且想花费时间,则添加实时索引更新。

Lucene和Sphinx是很好的select,就像Xapian一样 ,它很好,很轻便。 如果你走Lucene的路线,不要以为Clucene会更好,即使你不想和Java搏斗,尽pipe我没有真正有资格讨论两者的优点和缺点。

随着MyISAM的逐步淘汰, InnoDB全文search(FTS)终于在MySQL 5.6.4发布中可用。

http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html#innodb-fulltext-index

这些索引在物理上performance为整个InnoDB表,这些表由SQL关键字(如CREATE INDEX语句的FULLTEXT子句,SELECT语句中的MATCH()… AGAINST语句和OPTIMIZE TABLE语句)执行。

虽然其他引擎有很多不同的function,这一个是InnoDB,所以它是本地的(这意味着有一个升级path),这是一个值得的select。

你应该花一个小时去安装和testingSphinx和Lucene的驱动。 看看是否满足您的需求,关于数据更新。

让我对斯芬克斯感到失望的事情之一就是它不支持增量插入。 也就是说,插入后重新索引非常昂贵,所以推荐使用的解决scheme是将数据拆分为旧的,不变的行和更新的易失行。 因此,您的应用程序执行的每个search都需要search两次:一次是较大索引中的旧行,另一次是最近行中较小的索引。 如果这不符合你的使用模式,这个狮身人面像不是一个好的解决scheme(至less在目前的实施中)。

我想指出另一个可以考虑的解决scheme: Google Custom Search 。 如果您可以将一些search引擎优化应用于您的networking应用程序,那么将索引和searchfunction外包给Google,并将Googlesearch文本框embedded到您的网站中。 这可能是使您的网站可search的最经济和可扩展的方式。

也许你不应该这么快就解雇MySQL的FT。 Craigslist曾经使用它 。

MySQL的速度和全文检索使craigslist能够为用户提供服务。craigslist使用MySQL以每秒高达60次的search速度每月提供大约5000万次search。“

编辑

如下所述,Craigslist在2009年初似乎已经转换到了狮身人面像 。

正如你所指出的,狮身人面像是相当不错的东西。 所有的工作都在configuration文件中。 确保你的表是与string有一些唯一的整数ID键,你应该没事的。

尝试这个

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0 

你应该看看狮身人面像。 这是值得一试。 它的索引是超快的,它是分布式的。 你应该看看这个(http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown)webminar。; 它谈到search,并有一些整洁的基准。 您可能会发现它有帮助。

如果一切都失败了,总会有soundex_match ,这可悲的是不是很准确