我有一个相对复杂的sqlcipher DB(27个表)但是几乎没有条目(每个表50-200个条目之间)。 当我运行SELECT语句(与相应的视图相同)时,连接3个表,执行一些“LIKE”(使用EXPLAIN优化), 桌面客户端CPU(使用sqlcipher)需要3ms < / em> 用于查询。
然而 Android上使用Cordova-SQLitePlugin的相同查询需要接近1900ms - 因为打开数据库成本 1800ms ,显然在每次加载页面后都会重复。
查询的发布方式如下:
var db = window.sqlitePlugin.openDatabase({name: "myDatabase", key: "mySecret", bgType: 1});
db.transaction(function(transaction) {
transaction.executeSql(query, [],function(transaction, result) {
callback(result);
}, null);
},null,null);
我能做些什么吗? 提前感谢任何提示和线索...
干杯克里斯
答案 0 :(得分:3)
SQLCipher打开数据库的表现有意慢。 SQLCipher使用密钥PBKDF2来执行密钥派生(即数千个SHA1操作)以防止暴力破解和字典攻击。有关详细信息,请参阅http://sqlcipher.net/design。
最好的选择是缓存数据库连接,以便可以多次使用它,而无需在每个屏幕上打开和键入数据库。如果可以,在启动期间打开数据库一次是首选的操作过程。对同一数据库句柄的后续访问不会触发密钥派生,因此性能将非常快。
如果不可能,则另一个选项是禁用或削弱密钥派生。这将导致SQLCipher在导出密钥时使用更少轮的PBKDF2。虽然这会使数据库打开得更快,但从安全角度来看,它显着变弱。因此通常不建议这样做。也就是说,这里有关于如何减少KDF迭代的信息: