我有一个SQLite数据库,有大约40万个条目.要查询db我使用以下方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是检索单个条目并且查询很少需要大约0.5秒,它会建立并且方法执行10秒.怎么说出来?
首先,使用INDEX
http://www.sqlite.org/lang_createindex.html
在你的情况下将是这样的:
CREATE INDEX idx_bigram ON bigrams (bigram)
Run Code Online (Sandbox Code Playgroud)
其次,使用'?' 而不是文字查询.它有助于sqlite缓存请求:
String select = "SELECT frequency FROM bigrams WHERE bigram = ?";
Cursor mCursor = db.rawQuery(select, new String[]{ bigram });
Run Code Online (Sandbox Code Playgroud)
第三,我相信查询比rawQuery更有效:
mCursor = dq.query("bigrams", new String[] { "frequency" }, "bigram = ?",
new String[]{ bigram }, null, null, null, null);
Run Code Online (Sandbox Code Playgroud)
第四,您可以一次查询多个值(与第2点不兼容):
SELECT frequency FROM bigrams WHERE bigrams IN ('1', '2', '3')
Run Code Online (Sandbox Code Playgroud)
第五,您不需要每次都打开数据库.你应该考虑让它保持开放.
在看到这个问题的IN子句和占位符后,看起来你可以将2和4结合起来(不确定它是否有用)