2009-02-13 26 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。但不一定按照正確的順序],然後搜索這些句子的那些行。應該避免每次都做一次表掃描。

如果你需要我進一步解釋請查詢