我们的Android应用程序中大约有7-8个表,每个表平均有8列。读和写操作都是在数据库上执行的,我正在试验并试图找到提高DataAccess层性能的方法。因此,到目前为止,我尝试了以下几点:
我在妄想中提到了我的假设,如果我错了,请纠正我。
问题:
发布于 2010-11-03 11:52:08
ANALYZE可以使SQLite的查询计划器更有效地工作。SELECT和UPDATE,索引可以提高,但是只有当您创建的索引能够被需要加速的查询实际使用时。在查询中使用EXPLAIN QUERY PLAN查看将使用哪个索引,或者查询是否需要完整的表扫描。对于大型表,完整的表扫描是错误的,您可能需要索引。对于任何给定的查询,只使用一个索引。如果您有多个谓词,那么将使用的索引是预期将最大程度地减少结果集的索引(基于ANALYZE)。可以有包含多个列的索引(用于使用多个谓词辅助查询)。如果有具有多列的索引,则只有当谓词从左到右匹配索引时才能使用,没有空白处(但末尾未使用的列是可以使用的)。如果使用排序谓词(<、<=、>等),则需要在索引的最后一列中使用该谓词。同时使用WHERE谓词和ORDER BY都需要索引,而SQLite只能使用一个索引,因此这可能会影响性能。您拥有的索引越多,INSERT的速度就越慢,因此您必须为您的情况制定最佳的折衷方案。INSERT,请尝试删除索引并在结束时重新创建它们。您需要对此进行基准测试。我不知道你能从Android应用程序那里得到多少。在一般的更详细的指南文档中,有一个用于优化SQLite的SQLite。
发布于 2012-03-08 19:58:28
下面是一些代码,可以从运行中的安卓应用程序将EXPLAIN QUERY PLAN结果输入到Android中。我从SQLiteOpenHelper dbHelper和SQLiteQueryBuilder qb开始。
String sql = qb.buildQuery(projection,selection,selectionArgs,groupBy,having,sortOrder,limit);
android.util.Log.d("EXPLAIN",sql + "; " + java.util.Arrays.toString(selectionArgs));
Cursor c = dbHelper.getReadableDatabase().rawQuery("EXPLAIN QUERY PLAN " + sql,selectionArgs);
if(c.moveToFirst()) {
do {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < c.getColumnCount(); i++) {
sb.append(c.getColumnName(i)).append(":").append(c.getString(i)).append(", ");
}
android.util.Log.d("EXPLAIN",sb.toString());
} while(c.moveToNext());
}
c.close();我把它放到了我的ContentProvider.query()中,现在我可以确切地看到所有查询是如何执行的。(在我的例子中,问题似乎是查询太多,而不是索引使用不当;但这可能会帮助其他人.)
发布于 2010-11-03 10:49:33
我想补充以下几点:
https://stackoverflow.com/questions/4015026
复制相似问题