如何在Sqlite / Android中提高SELECT查询的性能?

时间:2012-01-30 02:20:02

标签: android sqlite

我在Sqlite& S中使用简单的SELECT查询获得了糟糕的性能和可能的奇怪行为。 Android系统。 SqliteDatabase.query()仅在1毫秒内执行我的查询,但使用Cursor.get*()获取结果需要超过150毫秒才能返回8行!

我正在尝试查找表englishword列以“prefix”(任意字符串)开头的所有行,按row列对结果进行排序,并且只返回前8个结果。

这是我的代码:

String columns[] = {"word", "rank"};
Cursor cursor = mDB.query("english", columns, "word LIKE '" + prefix + "%'", null, null, null, "rank,word", "8");

// It takes only 1 ms to get here

String word = "";
int rank = 0;
if (cursor.moveToFirst()){
    do {
        word = cursor.getString(0);
        rank = cursor.getInt(1);
    }
    while(cursor.moveToNext());
}

cursor.close();

// It takes over 150 ms to get here!

english的表定义是:

CREATE TABLE en (_id INTEGER PRIMARY KEY, word TEXT, rank INTEGER)

它包含大约65,000个条目。它还在wordrank上编制索引,两者都有第三个索引(我正在绝望!):

CREATE INDEX "rank" ON "en" ("rank" ASC)
CREATE INDEX "word" ON "en" ("word" ASC)
CREATE INDEX "word_rank" ON "en" ("word" ASC, "rank" ASC)

提前致谢!

1 个答案:

答案 0 :(得分:2)

查询方法实际上并不检索所有数据,游标在行中移动时会检索它。因此,Cursor.move *()方法比查询慢。

这种“延迟加载”概念有助于节省内存,因为只需要根据需要检索相关数据。

至于表现,你真的没有做错任何事。你在模拟器上尝试这个吗?也许可以在实际设备上试用它并测试性能。