Android中Sqlite的使用性能优化方法总结

  项目中业务对DB依赖较强,并且在较大数据量的情况下,对速度要求较高,在开发过程中总结了一些提高db操作效率的方法,在此记录。

   一、 提高查询性能

   1. 尽量不要使用字符窜函数(如Lower), 否则查询时间将大幅增加(特定情况下有时增大4倍以上)。

   2. 尽量不要使用字符类的字段进行过滤查询

   3. 尽量使用数字匹配的过滤项

   4. 在建表过程中, 将整型字段排在前面,字符类型、blob类型字段放在后面,会提高查询效率

   5. 对于大数据量且查询频繁的表, 一定要建索引,但索引也不要建得太多。

   6. 模糊查询技巧:将 xx LIKE ‘abc%’,转换成:x>=‘abc’ AND x<‘abd’(在特定情况下测试发现一般都在10倍以上)

      对于路径类查询,如"path/child1/child2"这种情况,可以将

WHERE col like 'path%'

  替换成

WHERE col>'path' AND col<'path0'

   (/的assic码为47, 0的assic码为48)

   因为是比对assic码, 所以对于那些要求大小写不敏感的查询,无法使用此方法。

   7. 在存在索引的情况下, 尽量使用=、>、<、IN等操作符来代替BETWEEN、LIKE、OR,因为BETWEEN、LIKE、OR无法用于索引。

   比如, 将

WHERE xx = 'aa' OR xx = 'bb' 

 替换成 

WHERE xx IN ('aa', 'bb')

   

8. 在查询条件复杂的情况下, 有时先全部查出来,再在java层做过滤处理要比直接使用复杂sql快得多。

   

  二、提高修改操作的性能

   1.使用事务, 但千万不要忘记提交事务db.endTransaction();否则线程会有阻塞危险

      另外, 事务只能用在一个线程中, 不可跨线程。

   2. 原始Sql语句比ContentProvider执行效率高的多, 针对Provider, 尽量使用applyBatch, 并且重写applyBatch方法, 在其中加入事务处理, 如:

 db.beginTransaction();
 try {
       result = super.applyBatch(operations);
       db.setTransactionSuccessful();
    }
  catch(Exception e) {
   }
  finally {
      if(db.inTransaction()) {
     db.endTransaction();
  }

  3. 及时在applyBatch中加入事务, 其效率较原生sql也是差很多的,这是对于某些操作,如delete,可以考虑换成单条语句的形式, 如多个delete的ContentProviderOperation改为在一条语句中用delete where id in(xx, xx, xx,...)的形式。

  4.  因为binder缓存只有1M的空间, 在ContentProviderOperation List 巨大的情况下, 会出现批量操作失败的情况。这时要考虑分批调用applyBatch, 而不是一次行传入全部List。可以考虑分批加上一条中所说的组合方式

  5. 在执行大批量插入过程中, 尽量不要依赖约束去做数据校验处理, 如利用unique约束去自动排除掉重复的信息, 在程序层在插入前利用一个缓存来去重效率要高的多,虽然要牺牲掉一些内存。

  6. 在修改频繁且数据量大的表上不要建太多索引。

  

   

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值