7

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

  1. 主键(无符号数)
  2. 名称(多字文本)
  3. 说明(最多 1000 个 varchar)

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

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

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

4

3 回答 3

7

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

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

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

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

  1. 创建一个单独的表,其中包含每个单词(索引)以及它所引用的记录 id。这将允许您搜索单个单词。
  2. 使用针对解决此问题进行了优化的不同系统。除非我的信息现在已经过时,否则解决此问题最流行的 2 个引擎是:
    1. 狮身人面像
    2. Solr / Lucene
于 2013-06-25T00:44:36.497 回答
0

如果您的表是 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找到更多信息

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

于 2013-06-25T00:27:15.097 回答
0

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

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

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

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

于 2013-06-25T00:16:07.137 回答