我正在开发一个Iphone应用程序,其中用户在搜索栏中输入任何字符串并按下搜索按钮。之后会出现结果列表。
在我的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将选择第一个数据集。 如果用户输入值“report”,则将选择第一个和第二个数据集。
由于我使用的数据库有近60,000个数据集,因此搜索部分字符串实际上是在扼杀性能。
在所有4列设置索引将使SQLite数据库的大小过大。 所以我根本没有使用索引。
我的Select Statement如下所示:
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];
有没有什么好方法可以提高在所有列中搜索零件字符串的性能?
谢谢你,亲切的问候,
丹尼尔
答案 0 :(得分:2)
您正在全文搜索之后,SQLite本身不支持。我对第三方支持没有任何经验,但based on results有一些选择。
答案 1 :(得分:1)
您回答了自己的问题:对所有四列进行索引。并测量尺寸差异。考虑到iPhone的存储容量,您可能会试图减少存储空间。
使用SQLite性能的经验法则不是对未编入索引的查询进行处理。
您可以使用相同的架构和EXPLAIN QUERY PLAN在Mac上创建数据库,从而了解SQLite实际在做什么。 (还有EXPLAIN,它更详细但不太明显。)
答案 2 :(得分:0)
您可以创建一个单独的表,其中包含两列:模式字符串和键值(用于表示数据表)。让我们称这个表为“search_index”。
然后,在对数据表条目进行任何更改时,您将更新“search_index”表:
您可以自己计算详细信息,但这样,您只需构建自己的(部分)搜索索引。
查询时,您最多可以使用X个字符在search_index表中进行搜索。如果用户输入的字符数超过X个,则至少要搜索一组有限的数据表行。这样您就可以轻松搜索这些60k行。
为X找到一个很好的价值,以平衡存储需求,可用性和性能。
编辑:看起来你不想只搜索单词的开头?那么,你不应该只使用“前X个字符”,但是你应该将数据分成单个单词,并使用search_index中的完整单词。虽然在实践中,与为所有列提供索引相比,您仍将拥有大约四分之一的索引存储要求。因此,构建自己的“search_index”仍然是一件好事。