我在Sqlite& S中使用简单的SELECT查询获得了糟糕的性能和可能的奇怪行为。 Android系统。 SqliteDatabase.query()
仅在1毫秒内执行我的查询,但使用Cursor.get*()
获取结果需要超过150毫秒才能返回8行!
我正在尝试查找表english
中word
列以“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个条目。它还在word
和rank
上编制索引,两者都有第三个索引(我正在绝望!):
CREATE INDEX "rank" ON "en" ("rank" ASC)
CREATE INDEX "word" ON "en" ("word" ASC)
CREATE INDEX "word_rank" ON "en" ("word" ASC, "rank" ASC)
提前致谢!
答案 0 :(得分:2)
查询方法实际上并不检索所有数据,游标在行中移动时会检索它。因此,Cursor.move *()方法比查询慢。
这种“延迟加载”概念有助于节省内存,因为只需要根据需要检索相关数据。
至于表现,你真的没有做错任何事。你在模拟器上尝试这个吗?也许可以在实际设备上试用它并测试性能。