【问题标题】:Android SQLite much slower than HTML5 WebSqlAndroid SQLite 比 HTML5 WebSql 慢得多
【发布时间】:2013-02-26 23:53:43
【问题描述】:

两个数据库应用程序,一个 HTML5 WebSql 和一个使用 ADT 构建的 Android。两者都使用完全相同的 Sqlite 数据库,因此具有相同的架构、表和索引。

SELECT
    road.description,
    xy.lat AS lat,
    xy.lon AS lon,
    road.id_road AS id_road
FROM xy
INNER JOIN road
  ON xy.id_road = road.ID_ROAD
WHERE xy.lat BETWEEN -36.89804010977648
                 AND -36.878040110223516
  AND xy.lon BETWEEN 174.78966425022352
                 AND 174.8096642497765

Web 应用程序使用 db.transaction。 Android SQL 在一个类中运行,该类使用在异步进程中创建的数据库对象扩展 SQLiteOpenHelper。

SQLiteDatabase dbr = this.getReadableDatabase();
Cursor cursor = dbr.rawQuery(sql, null);
if( cursor.moveToFirst()){
    // loop through and analyse approx 400 results
}

在 HTC-1V 硬件上测试 HTML5 在 250 毫秒内运行上述查询,在 Android 应用程序上仅需要 4000 毫秒才能打开光标。是否可以从 Android 应用获得 WebSql 性能?

【问题讨论】:

  • 你用什么做基准测试? 4000 毫秒只是为了获得一个可读的数据库,运行一个小查询并获得一个游标是有点荒谬的。我从来没有经历过。在包含几千条记录的数据集上,我从未见过应用出现明显的减速。
  • @jlindenbaum,嗨,这是一个 35mb 的数据库,xy 表有 264k 行。对于基准测试,我们比较了开始和结束 Date.getTime()。还循环运行查询并计算平均时间。
  • 你是在模拟器还是真机上运行?
  • @Stéphane 它在最近的智能手机 HTC 1V 硬件上

标签: android sqlite


【解决方案1】:

很难说出确切的原因,但我可以告诉你应该创建哪些索引以使其更快地工作(除非你已经拥有这些索引):

CREATE INDEX road__id_road_idx       ON road (id_road);
CREATE INDEX xy__id_road_lat_lon_idx ON xy   (id_road, lat, lon);

另外,请参阅this answer,了解如何在 Android 上优化您的查询,但基本思路是在 EXPLAIN QUERY PLAN 下运行您的查询并尝试消除昂贵的扫描。

【讨论】:

  • 谢谢,但两个数据库上的索引相同,并使用 EXPLAIN 进行了仔细检查。还尝试了链接中描述的 .setMaxSqlCacheSize() 方法,看起来很有希望,但没有改变结果。
猜你喜欢
  • 2011-08-06
  • 2011-10-27
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多