Android开发中的SQLite优化

原创 2014年02月01日 01:17:46

关于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性能优化-SQLite数据库

本系列博文我想围绕在Android中的一些优化细节和大家进行分享。Android中的优化可谓又是一重任,Android不足以像PC端具有很高的内存执行空间给我们用来重量级使用开销。有限的内存资源限制了...
  • u013718120
  • u013718120
  • 2016年05月09日 11:05
  • 3899

Android:SQLite插入大量数据的效率优化

转载地址:http://zwkufo.blog.163.com/blog/static/2588251201311552757473/ 之前对于ContentResolver.app...
  • l_215851356
  • l_215851356
  • 2017年01月17日 16:31
  • 1902

Android SQLite性能分析

作为Android预置的数据库模块,SQLite精致而且强大,对它的深入理解对于提升应用的性能非常重要。这里对SQLite的性能和内存进行了一些测试分析,对比了不同操作的执行性能和内存占用的情况,粗略...
  • HorkyChen
  • HorkyChen
  • 2014年04月29日 22:18
  • 12899

Android知识梳理之Sqlite数据库的使用和优化

PS.不知不觉间发现自己已经做了很久很久的Android开发了,过去对知识块的梳理总是放在云笔记里面.主要的原因还是自己的笔记太杂乱,没有脉络.本着开源的精神,也趁着这段时间有空将之前云笔记里面的文章...
  • unreliable_narrator
  • unreliable_narrator
  • 2016年04月18日 15:20
  • 587

Android 中 SQLite 性能优化

SQLite 数据库 性能优化 索引
  • qq_33344834
  • qq_33344834
  • 2016年07月09日 08:54
  • 363

Android中Sqlite的使用及性能优化

1.写在前面的话前面写过一篇关于Sqlite基本操作的文章,今天我们来学习Android中如何使用Sqlite以及性能优化。2.Android平台下数据库相关类SQLiteOpenHelper 抽象类...
  • txvaqh
  • txvaqh
  • 2016年09月05日 10:59
  • 2808

Android SQLite Database 写入速度慢的一个解决方案

在写之前的阅读器时,就发现数据库写入的速度有些不如人意,一千条左右数据,需要十秒以上的时间才能完成写入,当时未深究原因,只当是disk写入速度缓慢导致的,大概代码如下:public void inse...
  • qq_33705491
  • qq_33705491
  • 2017年02月18日 15:06
  • 1214

【玩转SQLite系列】(五)SQLite数据库优化

【玩转SQLite系列】(五)SQLite数据库优化 >在平时的开发中,其实我们每次给数据库中插入一条数据,数据库都会单独开启一个事务,我们插入多少条数据, 就会对磁盘由多少次操作。这样在数据比较多的...
  • u010785585
  • u010785585
  • 2016年11月25日 07:42
  • 2098

提升SQLite数据插入效率低、速度慢的方法

前言 SQLite数据库由于其简单、灵活、轻量、开源,已经被越来越多的被应用到中小型应用中。甚至有人说,SQLite完全可以用来取代c语言中的文件读写操作。因此我最近编写有关遥感数据处理的程序的...
  • majiakun1
  • majiakun1
  • 2015年06月23日 16:29
  • 34454

Sqlite大数据量查询优化比较-转

标题写的有些大了…… 我做的一个PHP玩具用的是Sqlite数据库,昨天某网站采集了4039篇文章,发现页面打开速度慢的要死,看了一下耗时,发现sqlite在数据量比较大(4000算大?……我觉...
  • xp5xp6
  • xp5xp6
  • 2016年01月16日 15:10
  • 2891
收藏助手
不良信息举报
您举报文章:Android开发中的SQLite优化
举报原因:
原因补充:

(最多只允许输入30个字)