项目中业务对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. 在修改频繁且数据量大的表上不要建太多索引。

  

   

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: