代码之家  ›  专栏  ›  技术社区  ›  Pau

iphonesqlite性能问题

  •  2
  • Pau  · 技术社区  · 15 年前

    嘿,伙计们,这里是最低点。

    我有一个表,由主键(col1)、文本(col2)和文本(col3)组成。基本上是一张地图。此表包含大约200000行。检索一行基本上需要1.x秒(这就是我想要的)。我基本上是使用select*from表,其中col2='somevalue'。

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

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

    任何帮助都将不胜感激。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Juergen    15 年前

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

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

    您可以做什么:在col2上只创建一个索引(这就是这个select所需的索引!)。

    然后使用“EXPLAIN SELECT…”来获取信息,以及SQLite如何利用这些信息。结果不容易阅读,但根据一些经验,可以看出是否使用了索引。你也可以在这里发布结果。

        2
  •  2
  •   paul paul    15 年前

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

    这就是为什么即使在我创建了索引之后,也没有任何性能改进。。。。

    奇怪,这会被认为是Xcode的bug吗?

        3
  •  1
  •   rpetrich    15 年前

    我将该类设置为单例(称为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项目的方式完全相同。。。