开发者社区> horky> 正文

Android开发中的SQLite优化

简介: 关于SQLite的优化,首先是能用SQL语句批次处理的,就不要单笔操作,Cursor就更是能不用就不用。比如成批的DELETE/UPDATE,将条件组装到SQL语句,会比使用CURSOR一条条的查再删效率要高很多(若干年前就曾使用存储过程代替单笔操作,将一次批量计算时间从一天缩到了数分钟以内,参考)。
+关注继续查看

关于SQLite的优化,首先是能用SQL语句批次处理的,就不要单笔操作,Cursor就更是能不用就不用。比如成批的DELETE/UPDATE,将条件组装到SQL语句,会比使用CURSOR一条条的查再删效率要高很多(若干年前就曾使用存储过程代替单笔操作,将一次批量计算时间从一天缩到了数分钟以内,参考)。其次是对操作的优化:对于INSERT/UPDATE操作较多时使用事务,如果SELECT操作较多时,使用索引。


结合现在的工作,发现针对操作的优化,下面这篇文章可以翻译出来归档。以下为正文:


SQLite有一个简洁的SQL接口,且以低内存占用著称。现如今,SQLite已经在AndroidiOS开发中得到广泛的应用。本文主要讨论在Android应用如何优化SQLite的性能和资源占用。 


1, 使用事务(Transaction)

在默认情况下每一个SQL语句都被包一个全新的事务内,比如执行一个如INSERT这样基本的数据库操作,就会放到一个新创建的事务中执行。一次只需要操作一次数据库操作时,让SQLite自己来进行事务管理当然是明智的。但如果一次有大量的操作要做时,比如循环调用INSERT添加时,这样就显得开销过大了,因为每一笔操作都要重新打开、写入,最后再关闭journal文件, 这个文件是临时用来保存数据操作的中间结果,详细内容看这里(参考)。 


如果明确地在一系列SQL语句前后以BEGIN TRANSACTIONEND TRANSACTION这样显示地使用事务就可以避免上面的情况。对于那些不会改变数据的操作,这样的方式也同样可以提速(好似数据库操作中单笔的操作效率将远低于批次操作,如果用SQL语句可以搞定的事,就不可使用Cursor进行操作)。


注明:除了发起事务外,你必须还要负责对事务的提交和回滚操作。


在Android应用开发中可以使用类似如下的方式使用BEGIN TRANSACTIONEND TRANSACTION:


db.beginTransaction();
try{
  for(int i =0; i< LENGTH ; i++,sequenceNum++)
  {
  // execute SQL
  }
  db.setTransactionSuccessful();// marks a commit
}
finally{
  db.endTransaction();
}



2. 使用索引

如果没有在数据库使用索引,当你在一个没有排序的数据表中使用映射查询(projection query)搜索时,无可避免的要执行一个全序列查找。这种情况通常并不是什么问题,每种数据库,包括SQLite都会为数据集执行索引来降低查找时间。


索引维护着一个表中某一列或某几列的顺序,这样就可以快速定位到一组值,而不用扫遍全表。所有的索引信息会被保存在一个独立的索引表中,所以会产生额外的空间占用,不过绝对物超所值,特别是当你会在数据库中进行大量的读及搜索操作时。


SQLite会自动为每一个UNIQUE栏位创建索引,包括主键(Primary Key)栏位,另外也可以通过CREATE INDEX进行显示地创建。


注:如果你的查询太复杂而无法使用所创建的索引,那你就要好好想想你数据库的结构了。



3. 在Where分支中使用限定符

如果以字串拼接出SQL语句的Where,莫不如使用SQLite的query操作带上'?'来编译查询。以下是它的好处:

 a. 有利于SQLite缓存这些查询及索引。

 b. 可以避免达到SQLite缓存的上限。使用字串拼接Where的查询,每一个都被视为不同的查询,这就容易达到缓存的上限。

 c. 可以避免非法的SQL注入。


转载请注明出处: http://blog.csdn.net/horkychen


参考:

1. SQLite查询优化性能要点

2. Android SQLiteDatabase

3.   Android SQLite性能分析


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
性能优化:Android中Bitmap内存大小优化的几种常见方式
性能优化:Android中Bitmap内存大小优化的几种常见方式
164 0
Android 13 新的换行策略和针对日文的优化
Android 13 新的换行策略和针对日文的优化
89 0
浅谈Android的流畅性优化——归因分析
在前文中,我们讲到了何为性能优化,以及详解了性能优化的四大类,如果你还没看过上述的两篇文章,你可以点击这里(初识性能优化 、 探析Android中的四类性能优化)进行查阅,有了这些理论知识再来看本篇文章会更加的通透。
113 0
浅谈Android的流畅性优化——案例分享
学习了前文的归因分析,本篇文章就带大家以实际的案例进行浅要的分析和给出具体的优化策略,具体的案例来自于网络,如有错误,还请指出。
46 0
Android 序列化框架 Gson 原理分析,可以优化吗?
Gson 是 Google 推出的 Java Json 解析库,具有接入成本低、使用便捷、功能扩展性良好等优点,想必大家都很熟悉了。在这篇文章里,我们将讨论 Gson 的基本用法和以及主要流程的源码分析。
75 0
山川湖海 - Android无障碍功能优化实践
本文主要分享Android无障碍功能的一些优化经验,希望看完本篇,可以帮助到你,以及哪些特殊的用户。
100 0
Android Socket通讯 之 表情列表优化、业务逻辑优化
Android Socket通讯 之 表情列表优化、业务逻辑优化
97 0
Android MVVM框架使用(十三)UI更新 (App启动白屏优化、适配Android10.0深色模式)
Android MVVM框架使用(十三)UI更新 (App启动白屏优化、适配Android10.0深色模式)
175 0
Android 启动优化说明、黑白屏处理
Android 启动优化说明、黑白屏处理
338 0
Android 音乐APP(二)启动白屏优化、定位当前播放歌曲
Android 音乐APP(二)启动白屏优化、定位当前播放歌曲
97 0
+关注
horky
Web及移动开发技术
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
Android组件化实现
立即下载
蚂蚁聚宝Android秒级编译—— Freeline
立即下载
Android开发之多进程架构
立即下载