除了使用fullsearch之外,如何有效地搜索数据库中的数据

时间:2009-02-13 06:47:49

标签: c# sql

我想在DB的某些表格或视图中搜索句子(单词组合)。我不想使用DB的Fultext搜索属性。有没有其他有效的方式?

4 个答案:

答案 0 :(得分:2)

没有全文搜索效率高。

基本上它归结为 衍生物一样,并且由于索引在大多数情况下被抛弃,因此它变成了一个非常昂贵的查询。

答案 1 :(得分:2)

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

话虽这么说,计算机比人类快得多。这实际上取决于您的系统有多少负载。使用MySQL,我们成功地在潜在客户信息表上实现了一个搜索系统。问题的本质是普通索引(包括全文)无法解决的问题。因此我们设计以使用全表扫描进行供电。

这涉及使用搜索数据创建尽可能窄的表,并将它们连接到包含相关但非搜索数据的更大表。

当时(4年前),可以在.06秒内扫描100,000条记录。 1,000,000条记录大约需要0.6秒。该系统仍在大量生产中使用,有数百万条记录。

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

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


编辑:搜索表格尽可能缩小。理想情况下,每条记录50-100个字节。 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倍。这意味着没有blob,没有varchars等...

如果有帮助,请告诉我。

答案 2 :(得分:1)

如果您正在使用JAVA,请查看Lucene

如果您使用的是.net,则可以查看Lucene.net,它将最大程度地减少对搜索查询的数据库调用。

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

  

Lucene.Net是源代码,   class-per-class,API-per-API和   Java Lucene的算法端口   搜索引擎到C#和.NET   利用Microsoft .NET的平台   框架。

     

Lucene.Net坚持API和   原始Java中使用的类   实施Lucene。 API   名称和类名称   保留意图给予   Lucene.Net C#的外观和感觉   语言和.NET Framework。对于   例如,方法Hits.length()in   Java实现现在读取   Hits.Length()在C#端口。

     

除了API和类   端口到C#,Java的算法   Lucene被移植到C#Lucene。这个   表示使用Java创建的索引   Lucene是来回兼容的   与C#Lucene;在阅读时,   写作和更新。实际上是一个Lucene   索引可以同时搜索和   使用Java Lucene和C#更新   Lucene处理。

答案 3 :(得分:0)

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

请询问您是否需要我进一步解释