可怜的SQLite实现?第一次数据访问方式太慢

car*_*i84 5 sqlite android

我是Android编程的新手,但是我很习惯使用SQLite数据库.

  • 我的应用程序在SD卡上打开一个SQLite3数据库并运行一个相对复杂的查询(5个连接,1个子查询,2个where子句) SQLiteDatabase.rawQuery

    public Cursor queryDataBase(String sql, String[] selectionArgs){
        Cursor c = myDB.rawQuery(sql, selectionArgs);
        return c;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • SQL语句由硬编码提供String.

  • 该查询返回包含24列的585行.
  • 我不得不在存储空间和索引之间进行权衡,但是在所有更大的表(目前大约约40,000个条目)上使用索引,SQLite显示查询: Steps: 155 , Sorts: 0, AutoIdx: 1077
  • 我没有使用主键,因此我也没有将任何内容重命名为"_id".

  • rawQuery的执行速度相对较快,执行时间约为2毫秒.

  • 访问此数据需要花费太多时间,例如通过c.moveToFirst(),执行时间大约是1700毫秒!(对于Cursor.getRowCount()来说相同,或者显然都是第一次访问实际结果集).
  • 使用例如SQLiteSpy在PC(2 GHz,1 GB RAM,SATA2 HDD)上执行相同操作,显示结果集需要15 ms.
  • 使用C++实现在PC上执行它也是15毫秒到30毫秒.

那我在这里错过了什么?我的手机800 MHz,2 GB RAM,MicroSD实际上可能慢了约120倍吗?

car*_*i84 1

除了仍然比在 PC 上慢一点之外,问题似乎在于未索引字段的处理。

虽然我原来的帖子中的配置慢了大约 120 倍,但我尝试使用完整索引的数据库进行相同的操作(这意味着在需要的地方都可以使用索引和主键),并且现在在 PC 上需要 9 毫秒的查询现在“仅”8 毫秒慢一些:执行时间大约 75 毫秒。

这当然仍然是一个非常令人失望的结果,因为我不想每次都使用索引,即使在非常小的表上也是如此。