我在iPhone应用程序中使用sqlite作为只读数据库。 一个用例涉及发出大量select语句,每个语句返回大约3行。 无法减少查询数,因为下一个查询的参数取决于先前查询的结果。 查询本身很简单:
SELECT int1, int2, int3, int4 , int5, int6, int7 FROM sometable WHERE (int1 = ? AND int2 = ?) or (int3 = ? and int4 = ?) ORDER BY ROWID
该表有一个索引(int1,int2)和一个索引(int3,int4)。所有int都有数据类型INTEGER
查询是通过C-API完成的。使用sqlite3_prepare_v2()编译语句并用于所有查询。在每次查询之后,在绑定新参数之前执行语句上的sqlite3_reset()。
使用标志SQLITE_OPEN_READONLY和SQLITE_OPEN_NOMUTEX打开数据库文件。
对iPhone的分析显示大部分时间花在sqlite3_step() - > sqlite3VdbeExec-> sqlite3BtreeBeginTrans-> sqlite3PagerSharedLock-> line pVfs-> xAccess()
我不是sqlite专家,但对我而言,看起来浪费了不必要的锁定时间。 不需要,因为它确保在完成此查询时没有其他数据库访问权限。 我也想知道sqlite3BtreeBeginTrans。是否为select语句创建了事务?
有谁能告诉我如何进一步优化这个?
答案 0 :(得分:1)
sqlite-user邮件列表中的正确答案: http://sqlite.org/pragma.html#pragma_locking_mode
加速大约40%......