Ios 如何优化SQLcipher性能?
我使用SQLCipher在我的应用程序中加密sqlite数据库。一切正常,但我的应用程序在获取数据库时运行缓慢。我将PRAGMA kdf_iter更改为4000,但仍然很慢。在加密之前,我没有任何问题Ios 如何优化SQLcipher性能?,ios,sqlite,sqlcipher,Ios,Sqlite,Sqlcipher,我使用SQLCipher在我的应用程序中加密sqlite数据库。一切正常,但我的应用程序在获取数据库时运行缓慢。我将PRAGMA kdf_iter更改为4000,但仍然很慢。在加密之前,我没有任何问题 -(NSError *) openDatabase { NSError *error = nil; NSString *databasePath = [self getDatabasePath]; const char *dbpath = [databasePath
-(NSError *) openDatabase {
NSError *error = nil;
NSString *databasePath = [self getDatabasePath];
const char *dbpath = [databasePath UTF8String];
int result = sqlite3_open_v2 (dbpath, &db , SQLITE_OPEN_READWRITE , NULL);
if (result == SQLITE_OK) {
sqlite3_exec(db, [@"PRAGMA kdf_iter = '4000';" UTF8String], NULL, NULL, NULL);
sqlite3_exec(db, [@"PRAGMA key = 'password'" UTF8String], NULL, NULL, NULL);
NSLog(@"Password is correct , Database is Activated");
sqlite3_exec(db, [@"PRAGMA cipher = 'aes-256-cfb';" UTF8String], NULL, NULL, NULL);
}
else {
NSLog(@"Incorrect password!");
}
if (result != SQLITE_OK) {
const char *errorMsg = sqlite3_errmsg(db);
NSString *errorStr = [NSString stringWithFormat:@"The database could not be opened: %@",[NSString stringWithCString:errorMsg encoding:NSUTF8StringEncoding]];
error = [self createDBErrorWithDescription:errorStr andCode:kDBFailAtOpen];
}
return error;
}
为什么使用循环流化床模式(aes-256-CFB)而不是CBC 我不相信硬件加密支持AES CFB,所以它可能会使用软件加密,而软件加密的速度可能会慢500多倍 从文档中: SQLCipher使用aes-256-cbc作为默认密码和操作模式。可以改变这一点,但一般不建议这样做
最后,我可以在Nick Parker的指导下优化我的SQLCipher性能 正如他所说: 优化SQLCipher性能有几个非常重要的指导原则:
- 不要反复打开和关闭连接,因为键派生是非常昂贵的。频繁打开/关闭数据库连接(例如,对于每个查询)是导致性能问题的常见原因,通常可以使用单例数据库连接轻松解决
- 使用事务来包装插入/更新/删除操作。除非在事务作用域中执行,否则每个操作都将发生在它自己的事务中,这会将速度降低几个数量级
- 确保数据规范化(即,使用良好的做法将数据分离到多个表中以消除冗余)。不必要的数据复制会导致数据库膨胀,这意味着SQLCipher需要操作更多的页面
- 确保为用于搜索或联接条件的所有列编制索引。如果不这样做,SQLCipher将需要跨大量页面执行完整的数据库扫描
- 如果执行大型删除、更新等操作,请定期清理数据库,以确保数据库紧凑
这对我也很有用。你好,扎夫,我改变了模式只是为了试试。你是对的!但即使没有CFB模式,它仍然很慢。没有加密,db访问速度慢吗?数据库大吗?不大。数据库在加密之前工作得很好,并没有任何延迟。我的数据库表包含近2000行。