android sqlite查询优化

时间:2011-10-11 10:24:47

标签: android sqlite

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

2 个答案:

答案 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
    }
}