2010-01-01 68 views
4

我正在開發一個Iphone應用程序,用戶在任何字符串中鍵入搜索欄並按下搜索按鈕。之後應該出現結果列表。更好的SQLite選擇語句的性能

在我的SQLite中,我有四列a,b,c,d。比方說,他們有以下值:

Dataset 1: 
a: code1 
b: report1 
c: description1_1 
d: description1_2 

Dataset 2: 
a: code2 
b: report2 
c: description2_1 
d: description2_2 

所以如果用戶輸入的值:「1_1」那麼第一個數據集將因爲clumn的C中選擇。 如果用戶輸入「報告」的值,則將選擇第一個和第二個數據集。

因爲我使用的數據庫接近60.000數據集搜索部分字符串實際上是在殺死性能。

在所有4列設置索引將使SQLite數據庫的大小太大。 所以我根本沒有使用索引。

我的Select語句如下:

NSString *sql = [NSString stringWithFormat:@"SELECT * FROM scode WHERE a LIKE '%@%@%@' OR c LIKE '%@%@%@' OR d LIKE '%@%@%@'", wildcard, searchBar.text, wildcard, wildcard, searchBar.text, wildcard, wildcard, searchBar.text, wildcard, wildcard, searchBar.text, wildcard]; 

是否有提高搜索中的所有列的部分串的性能沒有什麼好的辦法?

謝謝你,親切的問候,

丹尼爾

回答

2

你是全文搜索後,這SQLite的本身並不支持。我沒有任何第三方支持的經驗,但based on results有幾個選項。

+0

全文搜索絕對是他的追求,這一方面讓我感到困惑。 Sqlite有FTS3可用,但現在不啓用,不是嗎? – 2010-01-08 18:29:26

1

你解答了你自己的問題:做所有四列的索引。並測量大小差異。考慮到iPhone的存儲容量,您可能失去了平衡,試圖減少存儲空間。

具有SQLite性能的經驗法則不是做一個沒有索引的查詢。

通過使用相同模式和EXPLAIN QUERY PLAN在Mac上創建數據庫,您可以看到SQLite實際上在做什麼。 (也有說明,這是更詳細,但不太明顯。)

0

您可以創建一個單獨的表,有兩列:一個模式字符串和一個鍵值(用於引用您的數據表)。讓我們稱這個表爲「search_index」。

然後,在任何改變,你的數據表項,更新了「search_index」表:

  1. 刪除與改變的數據表中的行鍵
  2. 在數據表中每列行,請使用數據的前X個字符,然後將它們添加到search_index中,使用鍵

您可以自己計算出詳細信息,但通過這種方式,您只需構建自己的(部分)搜索索引。

查詢時,最多可以使用X個字符在search_index表中進行搜索。如果用戶鍵入的字符超過X個字符,則至少需要搜索數據錶行的有限集合。因此,您可以輕鬆搜索這些60k行。

爲了平衡存儲需求,可用性和性能,爲X找到一個很好的價值。

編輯:看起來你不想只搜索單詞的開始?那麼,你不應該只使用「前X個字符」,但你應該將數據拆分爲單個單詞,並在search_index中使用完整的單詞。儘管在實踐中,與爲所有列提供索引相比,您仍將擁有大約四分之一的索引存儲需求。所以,建立自己的「search_index」仍然是一件好事。