94

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

我最初计划对表使用 MyISAM(用于内置全文搜索功能),但由于单个写入操作而导致整个表被锁定的想法让我感到沮丧。行级锁更有意义(更不用说 InnoDB 在处理大型表时的其他速度优势)。因此,出于这个原因,我非常坚定地使用 InnoDB。

问题是...... InnoDB 没有内置的全文搜索功能。

我应该使用第三方搜索系统吗?像Lucene(c++) / Sphinx一样?你们中的任何一个数据库忍者有什么建议/指导吗?LinkedIn 的zoie(基于 Lucene)看起来是目前最好的选择...围绕实时功能构建(这对我的应用程序非常关键。)我有点犹豫要不要提交但没有一些洞察力......

(仅供参考:将在 EC2 上使用高内存设备,使用 PHP 服务于前端)

4

9 回答 9

58

随着 MyISAM 的全面淘汰,InnoDB 全文搜索(FTS)终于在 MySQL 5.6.4 版本中可用。

https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html上有很多有趣的细节。

虽然其他引擎有很多不同的特性,但这个是 InnoDB,所以它是原生的(这意味着有升级路径),这使它成为一个值得选择的选择。

于 2012-02-22T14:49:06.730 回答
50

我可以保证 MyISAM 全文是一个糟糕的选择——即使撇开 MyISAM 表的各种问题,我也看到全文内容脱轨并开始自我破坏并定期使 MySQL 崩溃。

一个专门的搜索引擎肯定是这里最灵活的选择——将帖子数据存储在 MySQL/innodb 中,然后将文本导出到您的搜索引擎。您可以非常轻松地设置定期的完整索引构建/发布,如果您觉得需要并想花时间添加实时索引更新。

Lucene 和 Sphinx 是不错的选择,Xapian也是不错的选择,它既漂亮又轻巧。如果您走 Lucene 路线,请不要认为 Clucene 会更好,即使您不想与 Java 搏斗,尽管我没有资格讨论两者的优缺点。

于 2009-09-04T22:50:19.667 回答
11

您应该花一个小时完成 Sphinx 和 Lucene 的安装和试驾。在数据更新方面,看看是否满足您的需求。

Sphinx 让我失望的一件事是它不能很好地支持增量插入。也就是说,在插入后重新索引非常昂贵,以至于他们推荐的解决方案是将数据拆分为较旧的、不变的行和较新的、易变的行。因此,您的应用程序执行的每次搜索都必须搜索两次:一次在旧行的较大索引上搜索,一次在最近行的较小索引上搜索。如果这没有与您的使用模式集成,那么这个 Sphinx 不是一个好的解决方案(至少在其当前实现中不是)。

我想指出您可以考虑的另一种可能的解决方案: Google 自定义搜索。如果您可以将一些 SEO 应用到您的 Web 应用程序,则将索引和搜索功能外包给 Google,并将 Google 搜索文本字段嵌入您的网站。这可能是使您的网站可搜索的最经济和可扩展的方式。

于 2009-09-04T23:28:47.690 回答
3

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

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

编辑

正如下面评论的那样,Craigslist 似乎在 2009 年初的某个时候切换到了 Sphinx 。

于 2010-12-15T01:53:59.977 回答
1

正如您所指出的,Sphinx 非常适合这些东西。所有工作都在配置文件中。确保你的表与字符串有一些唯一的整数 id 键,你应该没问题。

于 2009-09-04T19:48:13.603 回答
0

试试这个

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0
于 2011-05-12T06:03:49.297 回答
0

你应该看看狮身人面像。值得一试。它的索引速度非常快,而且是分布式的。您应该看看这个 (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown) 网络研讨会。它谈论搜索并有一些简洁的基准。您可能会发现它很有帮助。

于 2012-09-18T17:21:15.200 回答
0

如果其他一切都失败了,总是有soundex_match,遗憾的是它并不是真正快速准确

于 2013-03-18T14:33:24.067 回答
0

对于任何坚持使用 InnoDB 不支持全文搜索的旧版本 MySQL / MariaDB(即 CentOS 用户)的人,我在使用 InnoDB 表时的解决方案是为我想要搜索的内容创建一个单独的 MyISAM 表。

例如,我的主 InnoDB 表products具有各种键和引用完整性。然后我创建了一个简单的 MyISAM 表,名为product_search包含两个字段,product_id后者product_name被设置为FULLTEXT索引。这两个字段实际上都是主product表中内容的副本。

然后,我使用全文搜索 MyISAM 表,并对 InnoDB 表进行内部连接。

MyISAM 表的内容可以通过触发器或应用程序的模型保持最新。

如果您有多个需要全文的表,我不建议这样做,但对于单个表,在您可以升级之前,这似乎是一个足够的工作。

于 2020-06-02T07:00:18.613 回答