我有一个表,由主键(col1),text(col2)和text(col3)组成。基本上是一张地图。该表包含大约200k行。它基本上花了我大约1.x秒来检索一行(这是我想要的)。我基本上使用select * from table,其中col2 ='some value'。
我已经尝试为所有三列创建一个索引,每个列分别为col2和col3,但这实际上并没有改善我的情况。
我想知道,这是正常的吗?我没有遇到任何人抱怨大桌子的sqlite表现缓慢的帖子,所以我想知道我做错了什么。
非常感谢任何帮助。
答案 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项目完全相同......