Iphone Sqlite3查询太慢了

时间:2010-07-09 00:52:50

标签: iphone objective-c sqlite simulator

你好,我真的被我的应用程序困住了。我需要使用SQLITE3在我的一个表上使用aprox 250.000行(50mb)进行简单的SELECT。当我使用Iphone Simulator加载时,查询需要3秒aprox。当我在设备上测试我的应用程序时,查询需要90秒。不幸的是,我无法在90秒的等待时间内发布我的应用程序。在这里,我发布我的代码:

-(void) loadResults {

sqlite3 *database;
NSMutableString *street;
zone = [[NSMutableArray alloc] init];

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    const char *sqlStatement = [[NSString stringWithFormat:@"select street from streets "] UTF8String];
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {

            street = [NSMutableString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
            [zone addObject:street];
        }
    }   
    sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);}   

这就是我使用SQLITE3

创建表格的方法
CREATE TABLE streets (id INTEGER PRIMARY KEY, street TEXT, province TEXT, country TEXT, from TEXT, to TEXT, lat TEXT, lon TEXT);
CREATE INDEX strIndx on streets(street);

正如您所看到的,没有WHERE语句,它只是一个简单的“SELECT street FROM streets”

我在这里需要帮助 提前谢谢。

3 个答案:

答案 0 :(得分:3)

如果您有250,000行,只有3000个不同的结果,则每条街道平均在数据库中83次。

将街道划分为单独的规范化表格可能是合适的,每个值只出现一次,然后通过ID从地址表中引用这些街道。然后,对于TableView,您可以仅回退Streets表中的值。

如前所述,您可能还有UI范例问题。如果您在UI中有一个包含3000个条目的表,那对用户来说可能非常繁琐。 (想象一下,尝试向Yabar Street一次向下滚动一次。)

您可能希望至少延迟加载表,如之前所建议的那样。或者也许您可以允许用户键入街道名称,并提供Google建议类型的界面,在键入时弹出可能的匹配。

答案 1 :(得分:2)

你想做什么?当你承认你没有WHERE语句时,我假设你没有像Obj-C那样过滤行。因此,我唯一想到的就是你要做的事情(如果我错了请评论)是加载所有行以供显示。 Apple对此有一个非常简单的标准建议 - 懒洋洋地装载桌子。基本上,在原始查询中添加15行的限制,并有办法检索更多(通常这将是一个表格页脚,蓝色文字说“加载更多......”)。或者,这可以通过在请求之前不加载低于限制的单元格来实现(这将在用户滚动到它们时发生)。

答案 2 :(得分:0)

感谢您的回答Jared,我需要的是在UITableView中显示所有街道并让用户在UISearchBar中过滤搜索,或者让他从列表中选择它。我已将查询更改为

SELECT DISTINCT(street) from streets

这返回了3000行结果,但是它与没有DISTINCT的时间相同,即90秒。我也试过“GROUP BY街”,没有任何好处。但是,如果我添加.. LIMIT 3000,结果是即时的。我想,查询必须遍历整个表以获取DISTINCT值,这与LIMIT无关,它可能是INDEX的问题吗?我怎么知道索引是否有效? 再次感谢!