SQLite Select Statement的性能更佳

时间:2010-01-01 23:15:42

标签: iphone sql performance sqlite

我正在开发一个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];

有没有什么好方法可以提高在所有列中搜索零件字符串的性能?

谢谢你,亲切的问候,

丹尼尔

3 个答案:

答案 0 :(得分:2)

您正在全文搜索之后,SQLite本身不支持。我对第三方支持没有任何经验,但based on results有一些选择。

答案 1 :(得分:1)

您回答了自己的问题:对所有四列进行索引。并测量尺寸差异。考虑到iPhone的存储容量,您可能会试图减少存储空间。

使用SQLite性能的经验法则不是对未编入索引的查询进行处理。

您可以使用相同的架构和EXPLAIN QUERY PLAN在Mac上创建数据库,从而了解SQLite实际在做什么。 (还有EXPLAIN,它更详细但不太明显。)

答案 2 :(得分:0)

您可以创建一个单独的表,其中包含两列:模式字符串和键值(用于表示数据表)。让我们称这个表为“search_index”。

然后,在对数据表条目进行任何更改时,您将更新“search_index”表:

  1. 删除包含已更改数据表行的键的行
  2. 对于数据表中的每一列,使用数据的前X个字符,并使用键将它们添加到search_index
  3. 您可以自己计算详细信息,但这样,您只需构建自己的(部分)搜索索引。

    查询时,您最多可以使用X个字符在search_index表中进行搜索。如果用户输入的字符数超过X个,则至少要搜索一组有限的数据表行。这样您就可以轻松搜索这些60k行。

    为X找到一个很好的价值,以平衡存储需求,可用性和性能。

    编辑:看起来你不想只搜索单词的开头?那么,你不应该只使用“前X个字符”,但是你应该将数据分成单个单词,并使用search_index中的完整单词。虽然在实践中,与为所有列提供索引相比,您仍将拥有大约四分之一的索引存储要求。因此,构建自己的“search_index”仍然是一件好事。