2009-02-13 78 views

回答

2

如果不使用索引,数据库必须执行“全表扫描”。这就好像你一页一页地翻阅一本书来找到你需要的东西。

这就是说,电脑比人类快很多。这真的取决于你的系统有多少负载。使用MySQL,我们成功地实现了一个关于潜在客户信息表的搜索系统。问题的本质是一般的索引无法解决的问题(包括全文)。所以我们设计它使用全表扫描供电。

这涉及到创建尽可能窄的搜索数据表,并将它们与相关但未搜索的数据连接到较大的表。

当时(4年前),可以在0.06秒内扫描100,000条记录。 1,000,000条记录耗时约0.6秒。该系统仍处于大量生产使用状态,拥有数百万条记录。

如果您的数据需要超过6位数的记录,您可能需要使用全文索引重新评估,或对倒排索引进行一些研究。

如果您想了解更多信息,请发表评论。


编辑:搜索表被保持尽可能窄。理想情况下每个记录50-100个字节。如果你可以使用ENUMS和TINYINT来以另一种方式“映射”字符串值,那么ENUMS和TINYINT是非常好的空间保存器。

搜索查询是使用PHP类生成的。他们是简单的:

-- DataTable is the big table that holds all of the data 
-- SearchTable is the narrow table that holds the bits of searchable data 

SELECT 
    MainTable.ID, 
    MainTable.Name, 
    MainTable.Whatever 
FROM 
    MainTable, SearchTable 
WHERE 
    MainTable.ID = SearchTable.ID 
    AND SearchTable.State IN ('PA', 'DE') 
    AND SearchTable.Age < 40 
    AND SearchTable.Status = 3 

从本质上讲,这两个表中加入了一个主键(快速),并过滤通过全表扫描的SearchTable(非常快)来完成。我们正在使用MySQL。

我们发现,通过在MyISAM表中记录格式==“FIXED”,我们可以将性能提高3倍。这意味着没有斑点,没有变种等...

让我知道这是否有帮助。

2

没有像全文搜索那样有效。

基本上它归结为其中衍生物和因为索引倒去在大多数场景中,它成为一个非常昂贵的查询。

1

如果您使用的是Java有在看Lucene

如果您使用的是.NET,你可以在Lucene.net看看,就会对数据库进行搜索查询中调用最小化。

http://incubator.apache.org/lucene.net/

Lucene.Net以下是源代码, 类每类,API-每API和Java Lucene的 搜索引擎的 algorithmatic端口到C#和.NET 平台利用Microsoft .NET 框架。

Lucene.Net坚持使用原始Java 实现Lucene的API和 类。 API 名称以及类名称保留 Lucene.Net的外观和感觉的C# 语言和.NET框架。例如, 示例中,Java实现中的方法Hits.length()在 中现在读取的数目为 Hits.Length()在C#端口中。

除了C#的API和类 端口,Java 的算法Lucene被移植到C#Lucene。这 意味着用Java创建的索引 Lucene与C#Lucene来回兼容 ;在阅读时, 写作和更新。事实上,可以同时搜索Lucene 索引,并使用Java Lucene和C# Lucene过程更新 。

+0

你不必限于JVM采取Lucene的优势 - 您可以使用Solr的是围绕Lucene的一个HTTP包装。我已经与Solr取得了巨大的成功:http://lucene.apache.org/solr/ – 2009-02-13 07:05:19

+0

这太好了,不知道'回合,谢谢科迪! – renegadeMind 2009-02-13 07:27:48

0

你可以将文本分解为单独的单词,将它们粘贴在单独的表格中,然后使用它来查找包含搜索句子中所有单词的PK ID。但不一定按照正确的顺序],然后搜索这些句子的那些行。应该避免每次都做一次表扫描。

如果你需要我进一步解释请查询