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

时间:2013-06-25 00:13:50

标签: mysql ajax database

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

  1. 主键(无符号数)
  2. 姓名(多字文字)
  3. 描述(最多1000 varchar)
  4. 这个数据库已经有超过几十亿个条目。我以前没有处理如此大量数据的经验。

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

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

3 个答案:

答案 0 :(得分:7)

如果您正在使用FULLTEXT索引,那么您正确地编写了查询,并且返回结果的速度不够,您正在进入MySQL可能根本不适合您的领域..

可以能够调整设置,购买足够的RAM以确保您的整个数据集在内存中100%适合。在那里,性能提升可能是巨大的。

我绝对建议您调查一下mysql配置。我们过去曾经有过一些愚蠢的环境。操作系统默认设置非常糟糕!

但是,如果您在那时遇到麻烦,可以:

  1. 创建一个单独的表,其中包含每个单词(已编制索引)及其引用的记录ID。这样您就可以搜索单个单词。
  2. 使用针对此问题进行优化的其他系统。除非我的信息现已过时,否则解决此问题最常用的2个引擎是:
    1. 斯芬克斯
    2. Solr / Lucene

答案 1 :(得分:0)

你做不到。您的方案中唯一的快速搜索将在主键上,因为这最有可能是索引。文字搜索比乌龟慢。

严肃地说,你有几个解决方案:

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

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

答案 2 :(得分:0)

如果您的表是myISAM,那么您可以将名称和描述字段设置为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

找到更多信息

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