我有一个相对复杂的sqlcipher数据库(27个表)但几乎没有条目(每个表50-200个条目之间). 当我运行SELECT语句(与相应的视图相同)时,连接3个表,执行几个“LIKE”(使用EXPLAIN优化),桌面客户端CPU
当我运行SELECT语句(与相应的视图相同)时,连接3个表,执行几个“LIKE”(使用EXPLAIN优化),桌面客户端CPU(带有sqlcipher)需要3毫秒进行查询.
然而,使用Cordova-SQLitePlugin的Android上的相同查询花费了近1900ms – 由于打开数据库的成本约为1800毫秒,这显然在每次页面加载后重复.
查询的发布方式如下:
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);
有什么我能做的吗?
提前感谢任何提示和线索……
干杯克里斯
SQLCipher打开数据库的性能故意很慢. SQLCipher使用密钥PBKDF2来执行密钥派生(即数千个SHA1操作)以防止暴力破解和字典攻击.有关更多信息,请参阅 http://sqlcipher.net/design.最好的选择是缓存数据库连接,以便可以多次使用它,而无需在每个屏幕上打开和键入数据库.如果可以,在启动期间打开数据库一次是首选的操作过程.对同一数据库句柄的后续访问不会触发密钥派生,因此性能将非常快.
如果这不可能,则另一个选项是禁用或削弱密钥派生.这将导致SQLCipher在导出密钥时使用更少轮的PBKDF2.虽然这会使数据库打开得更快,但从安全角度来看,它显着变弱.因此通常不建议这样做.也就是说,这里有关于如何减少KDF迭代的信息:
http://sqlcipher.net/sqlcipher-api/#kdf_iter