搜索拥有超过 10 亿条记录的数据库的最有效方法是啥?

Posted

技术标签:

【中文标题】搜索拥有超过 10 亿条记录的数据库的最有效方法是啥?【英文标题】:Most efficient way to search a database with more than a billion records?搜索拥有超过 10 亿条记录的数据库的最有效方法是什么? 【发布时间】:2013-06-21 15:37:26 【问题描述】:

我的客户有一个庞大的数据库,其中只包含三个字段:

    主键(无符号数) 姓名(多字文本) 说明(最多 1000 个 varchar)

这个数据库有超过几十亿的条目。我以前没有处理如此大量数据的经验。

他希望我设计一个使用 AJAX(如 Google)的界面来搜索这个数据库。我的查询和乌龟一样慢。

在如此大的数据库中搜索文本字段的最佳方法是什么?如果用户在界面上输入错误的拼写,我该如何返回他想要的?

【问题讨论】:

您是否使用 FULLTEXT 并基于它进行搜索? 您需要只搜索名称还是同时搜索名称和描述? @Evert 我正在使用全文搜索。 @Gustek 我需要同时搜索名称和描述。 +1 表示“像乌龟一样慢”和拥有数十亿条记录的数据库! 【参考方案1】:

如果您使用的是 FULLTEXT 索引,并且您正在正确编写查询,并且返回结果的速度不够快,那么您正在进入一个 mysql 可能根本不足以满足您需求的领域..

可能能够调整设置,购买足够的 RAM 以确保您的整个数据集 100% 适合内存。毫无疑问,那里的性能提升可能很大。

我绝对建议您研究一下您的 mysql 配置的调整。过去我们有一些愚蠢的设置。操作系统默认设置真的很糟糕!

但是,如果您此时遇到问题,您可以:

    创建一个单独的表,其中包含每个单词(索引)以及它所引用的记录 ID。这将允许您搜索单个单词。 使用为解决此问题而优化的不同系统。除非我的信息现在已经过时,否则解决此问题最流行的 2 个引擎是:
      狮身人面像 Solr / Lucene

【讨论】:

【参考方案2】:

如果您的表是 myISAM,那么您可以将 Name 和 Description 字段设置为 FULLTEXT

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    Name VARCHAR(200),
    Description TEXT,
    FULLTEXT (Name,Description)
 );

然后你可以使用如下查询:

SELECT * FROM articles
    WHERE MATCH (Name,Description) AGAINST ('database');

您可以在http://docs.oracle.com/cd/E17952_01/refman-5.0-en/fulltext-search.html找到更多信息

在执行上述任何操作之前,您可能需要备份(或至少制作一个副本)您的数据库。

【讨论】:

【参考方案3】:

你不能。您的方案中唯一的快速搜索将在主键上,因为它最有可能是索引。文本搜索慢得像乌龟。

说真的,你有几个解决方案:

如果您必须坚持使用 NoSQL,您将不得不重新设计您的方案。在不了解需求的情况下很难给你一个好的建议。一种解决方案是在单独的表中索引关键字。

另一种解决方案是切换到不同的搜索引擎,您可以在此处找到其他问题的建议例如:Fast SQL Server search on 40M text records

【讨论】:

但我数据库中的主键只是愚蠢的数字,没有用。主键坐在那里并拖钓我:( 不,但实际上,如果不进行更改,您将无法使用当前的数据库引擎和方案解决此问题。 OP 没有提及无法进行更改。真正的答案怎么样?

以上是关于搜索拥有超过 10 亿条记录的数据库的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

匹配 hive 数据库中两个字段的最有效方法

在字符串中搜索未知模式的最有效方法?

将数千条记录插入表中的最有效方法是啥(MySQL,Python,Django)

在不对所有记录执行循环的情况下从数据库中检索特定数据的最有效方法是啥?

在数据库中的一组记录上存储排序顺序的最有效方法是啥? [关闭]

试图找到将 SQL Query 转换为具有大量记录的 Pandas DataFrame 的最有效方法