我有一个SQLite数据库,有大约40万个条目。要查询数据库,我使用以下方法:
public double lookUpBigramFrequency(String bigram) throws SQLException {
SQLiteDatabase db = dbh.getReadableDatabase();
double frequency = 0;
bigram = bigram.toLowerCase();
String select = "SELECT frequency FROM bigrams WHERE bigram = '"
+ bigram + "'";
Cursor mCursor = db.rawQuery(select, null);
if (mCursor != null) {
if (mCursor.moveToFirst()) {
frequency = Double.parseDouble(mCursor.getString(0));
} else {
frequency = 0;
}
}
return frequency;
}
但是检索单个条目并且查询很少需要大约0.5秒,它会建立并且方法执行10秒。怎么说出来?
答案 0 :(得分:5)
首先,使用INDEX
http://www.sqlite.org/lang_createindex.html
在你的情况下会是这样的:
CREATE INDEX idx_bigram ON bigrams (bigram)
其次,使用'?'而不是文字查询。它有助于sqlite缓存请求:
String select = "SELECT frequency FROM bigrams WHERE bigram = ?";
Cursor mCursor = db.rawQuery(select, new String[]{ bigram });
第三,我相信查询比rawQuery更有效:
mCursor = dq.query("bigrams", new String[] { "frequency" }, "bigram = ?",
new String[]{ bigram }, null, null, null, null);
第四,您可以一次查询多个值(与第2点不兼容):
SELECT frequency FROM bigrams WHERE bigrams IN ('1', '2', '3')
第五,您不需要每次都打开数据库。你应该考虑让它保持开放。
看到这个问题后IN clause and placeholders看来你可以将2和4结合起来(不确定它是否有用)
答案 1 :(得分:-1)
当您想要执行大量数据库操作时,始终使用事务机制
public static void doLotDBOperations() {
try {
// Code to Open Database
// Start transaction
sqlDb.beginTransaction();
// Code to Execute all queries
sqlDb.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
// End all transaction
sqlDb.endTransaction();
// Code to Close Database
}
}