Ios 如何优化SQLcipher性能?

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

我使用SQLCipher在我的应用程序中加密sqlite数据库。一切正常,但我的应用程序在获取数据库时运行缓慢。我将PRAGMA kdf_iter更改为4000,但仍然很慢。在加密之前,我没有任何问题

-(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将需要跨大量页面执行完整的数据库扫描
  • 如果执行大型删除、更新等操作,请定期清理数据库,以确保数据库紧凑
要诊断特定查询语句的性能问题,对特定查询运行解释查询计划命令可能会有所帮助

如果不确定哪些查询执行得不好,SQLCipher包含一个名为cipher\u profile的杂注,它允许分析查询及其各自的执行时间(以毫秒为单位)

这是

非常感谢尼克·帕克


这对我也很有用。

你好,扎夫,我改变了模式只是为了试试。你是对的!但即使没有CFB模式,它仍然很慢。没有加密,db访问速度慢吗?数据库大吗?不大。数据库在加密之前工作得很好,并没有任何延迟。我的数据库表包含近2000行。