iPhone Sqlite性能问题

时间:2009-07-25 09:07:14

标签: iphone sqlite

嘿伙计们,这里是低位。

我有一个表,由主键(col1),text(col2)和text(col3)组成。基本上是一张地图。该表包含大约200k行。它基本上花了我大约1.x秒来检索一行(这是我想要的)。我基本上使用select * from table,其中col2 ='some value'。

我已经尝试为所有三列创建一个索引,每个列分别为col2和col3,但这实际上并没有改善我的情况。

我想知道,这是正常的吗?我没有遇到任何人抱怨大桌子的sqlite表现缓慢的帖子,所以我想知道我做错了什么。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

我想说,这绝对不是典型的。

即使您拥有大型表,通过索引进行访问也应该相当快。

你能做什么:在col2上只创建一个索引(这是你唯一需要的选择!)。

比使用“EXPLAIN SELECT ....”获取信息,SQLite从中获取信息。结果不容易阅读,但有了一些经验,可以查看是否使用了索引。您也可以在此处发布结果。

答案 1 :(得分:2)

我解决了这个问题。就是当我创建一个新的sqlite数据库文件并将其添加到项目中时,xcode没有正确地重新编译自己,它仍然使用旧文件。我不得不从项目中删除旧数据库,删除计算机上的编译版本,清理项目,然后编译它,并确保它丢失,因为数据库丢失。然后再次删除已编译的文件,清理它,并重新添加新的sqlite数据库。

这就是为什么即使在我创建索引之后也没有任何性能提升....

很奇怪,这会被视为Xcode的错误吗?

答案 2 :(得分:1)

我已经使这个类成为一个单例(称为SQLAdapter),这里包含两个方法,一个用于复制数据库(如果需要),另一个用于执行我的sql代码:

这是sql代码方法,这是我第一次在Obj-C中编码,所以只是忽略字符串追加方法,我正在改变这个... ...

- (NSString *)getMapping:(NSString *)test{
    //Our return string
    NSString *res = test;

    // Setup the database object
    sqlite3 *database;

     NSString *sqlStmnt;
     if (direction) sqlStmnt = @"select * from table where col1 = '";
     else sqlStmnt = @"select * from table where col2 = '";

     NSString *tStmt = [sqlStmnt stringByAppendingString:test];
     NSString *sqlState = [tStmt stringByAppendingString:@"'"];
     const char * sqlStatement = [sqlState UTF8String];

    // Open the database from the users filessytem
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        // Setup the SQL Statement and compile it for faster access
        sqlite3_stmt *compiledStatement;
        //execute the statement
        if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) != SQLITE_OK) {
            NSAssert1(0, @"Error: during prepare '%s'.", sqlite3_errmsg(database));
        }
        //bind our translation into the sql select statment 
        sqlite3_bind_text( compiledStatement, 1 , [word UTF8String], -1, SQLITE_TRANSIENT);
        if(sqlite3_step(compiledStatement) == SQLITE_ROW) { //if execution is successful i.e. we get a match
            //lets return the desired language translation
            res = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, (direction) ? 2 : 1)];
        }
        sqlite3_finalize(compiledStatement);    //Release the compiled statement from memory
    }
    sqlite3_close(database);    //lets return the translation
    return res;
}

如果我没有弄错的话,几乎与SQLiteBooks项目完全相同......