我遇到sqllite
的问题。我对我的数据库执行查询,它的速度非常慢(我在真实设备上调试)。
我向SystemTrace添加了Trace
命令需要花费很多时间。事实证明,rawQuery.moveToFirst()
的召唤是这里的瓶颈。根据系统性能跟踪,单独调用它需要超过1.5秒(!)
Cursor rawQuery = myDataBase.rawQuery(query, null); // takes 0.5 milliseconds
rawQuery.moveToFirst();
do {
// assing values
} while (rawQuery.moveToNext());
rawQuery.close();
这非常慢。有人建议如何提高速度吗?
更新: 这里是我执行查询的两个表的sql。内部联接操作似乎需要这么多时间:
CREATE TABLE table_1 (_id int(7) NOT NULL PRIMARY KEY, text_1 VARCHAR(20), text_2 VARCHAR(40));
CREATE TABLE translation (_id int(7), language VARCHAR(10), meaning VARCHAR(100), FOREIGN KEY (_id) REFERENCES table_1(_id));
CREATE INDEX lang_match ON translation (language);
myDataBase.rawQuery("Select a._id, a.text_1, a.text_2, b.meaning from table_1 a inner join translation b ON a._id=b._id AND b.language='eng' WHERE text_1 like ?", new String[] { s + "%" });
答案 0 :(得分:1)
优化查询并将数据库操作移出主UI线程。
rawQuery()
只编译SQL但不运行它。移动光标实际上运行已编译的SQL程序,并且在Android SQLite的情况下,有一个CursorWindow
缓冲区,其中填充了游标数据。如果查询涉及例如很多I / O操作,填充光标窗口需要很长时间。