我的客户有一个巨大的数据库,其中只包含三个字段:
- 主键(无符号数)
- 名称(多字文本)
- 说明(最多 1000 个 varchar)
这个数据库有超过几十亿的条目。我以前没有处理如此大量数据的经验。
他希望我设计一个使用 AJAX(如 Google)的界面来搜索这个数据库。我的查询和乌龟一样慢。
在如此大的数据库中搜索文本字段的最佳方法是什么?如果用户在界面上输入错误的拼写,我怎样才能返回他想要的?
如果您使用的是 FULLTEXT 索引,您正在正确编写查询,并且返回结果的速度不够,那么您正在进入一个 MySQL 可能根本不足以满足您需求的领域。
您可以调整设置,购买足够的 RAM 以确保您的整个数据集 100% 适合内存。毫无疑问,那里的性能提升可能是巨大的。
我绝对建议您研究一下您的 mysql 配置的调整。过去我们有一些愚蠢的设置。操作系统默认值往往真的很糟糕!
但是,如果您当时遇到问题,您可以:
如果您的表是 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找到更多信息
在执行上述任何操作之前,您可能需要备份(或至少制作一个副本)您的数据库。
你不能。您的方案中唯一的快速搜索将在主键上,因为它最有可能是索引。文本搜索像乌龟一样慢。
说真的,你有几个解决方案:
如果你必须坚持使用 NoSQL,你将不得不重新设计你的方案。在不了解需求的情况下很难给你一个好的建议。一种解决方案是在单独的表中索引关键字。
另一种解决方案是切换到不同的搜索引擎,您可以在此处找到其他问题的建议,例如:Fast SQL Server search on 40M text records