android sqlite查询优化

Rad*_*dek 0 sqlite android

我有一个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秒.怎么说出来?

njz*_*zk2 5

首先,使用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结合起来(不确定它是否有用)