Android性能优化-sqlite优化

一、事务

对于事务,就是数据库的一次原子性的执行操作。原子性的执行操作为数据的整体性执行带来的可靠安全性。在SQLite中,如果我们默认事务(会为每个插入和更新都创建一次事务,并且在每次插入和更新后会立刻提交本次操作),即没有手动创建事务,假设此时有N条数据,那么数据的执行流程是 创建事务 -> 执行插入或更新操作 -> 提交事务,这样的流程会执行N次。如果我们手动创建了事务,则执行流程为: 创建事务 -> 执行N条SQL数据操作 -> 提交事务,这样的流程会执行1次。很明显,我们在SQLite中使用事务可以为插入和更新操作带来很大的优化。下面来看在SQLite中如何使用事务:

《Android性能优化-sqlite优化》 事务示例

二、sql编译

Sqlite想要执行操作,需要将程序中的sql语句编译成对应的SQLiteStatement,比如select * from record这一句,被执行100次就需要编译100次。对于批量处理插入或者更新的操作,我们可以使用显示编译来做到重用SQLiteStatement。

String sql =”insert into tb_test values (?,’test’);”;

SQLiteStatement sqLiteStatement =getReadableDatabase().compileStatement(sql);

for (int count =0 ; count <1000 ; count++){

        sqLiteStatement.clearBindings();

        sqLiteStatement.bindLong(1, count);

        sqLiteStatement.executeInsert();

}

三、索引

a.索引的概念

索引,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。

在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。 

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。

b.建立索引

基本语法:

CREATE INDEX index_name ON table_name;

c.索引的弊端

对于增加,更新和删除来说,使用了索引会变慢。

建立索引会增加数据库的大小。

四、分库分表

数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于设备资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

五、其他

少用cursor.getColumnIndex():使用cursor.getColumnIndex(),系统会根据列名来获取列所在的下标,比较耗时,所以我们可以使用static定义下标,直接通过下标来获取某列。

使用StringBuilder或StringBuffer来拼接字符串:SQL语句字符串的拼接或创建多个临时变量,此时我们可以使用StringBuilder或StringBuffer来拼接字符串,减少不必要的资源占用。

查询时,只返回自己需要的值或结果:如果在查询数据时直接将全部数据获取出来,这样的操作会带来不必要的系统资源开销和浪费。在查询时,我们尽量只取自己需要的字段和结果。

cursor使用后要及时关闭:即在查询完结果后,调用cursor.close()将资源关闭。

    原文作者:utopia84
    原文地址: https://www.jianshu.com/p/8bef9e42250c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞