0%

Android性能优化-数据库优化

前言

Android中使用SQLite做为数据库,当数据量很大的情况下,就可能会出现性能问题,比如查询速度过慢,更新速度过慢等,因此需要对其进行优化。

优化方法

  • 使用事务

    每次事务都会修改rollback journal文件,因此比较耗时,对于批量操作,应该合并到同一个事务中。

  • 建立索引

    对查询多,更新少的字段建立索引,但索引会占用空间,而且会降低更新速度。

  • 使用SQLiteStatement

    对于循环执行数据库操作,应该在循环外预编译好sql语句得到SQLiteStatement对象,然后循环内bindXXX,而不是直接在循环内调用execSQL方法,这样会导致创建大量的SQLiteStatement临时对象,而且每次都会重新编译sql语句。

  • 缓存getColumnIndex返回结果

    对于循环执行数据库操作,getColumnIndex方法应该放到循环前调用,而不是每次循环都调用一次,虽然该方法的本质是从Map中查找index,但对性能还是有一定的影响的,放在循环前调用会稍微快一些。

  • Cursor优化

    正如微信的WCDB所说,在合适的场景下,直接把Cursor的共享内存缓存去掉,会提高数据查询的速度。

  • 分表、分库

    SQLite的同步锁是表级别的,因此为了避免等待,可以按照具体场景拆分为多个表,或者分库。

  • SQL语句拼接

    不要用+进行连接,用StringBuilder,有循环的最后放到循环外部,不要每次循环都去生成sql语句字符串。

  • SQL语句优化

    适用所有数据库优化,不仅仅只是SQLite,见下部分。

SQL语句优化

  • 按需查询

    不需要的列不要查,columns指定为需要的列,更不能null。

  • 使用limit 1

    如果明确查询结果最多只有一条,可以加上limit 1,这样当查询到就会立马返回,而不是继续往下找直到表结束。同理,如果明确查询结果最多有N条,可以加上limit N。

  • 避免无法使用索引

    无法使用索引的有:!=、or、not in、like %xx等。

其它注意点

  • Cursor用完记得关闭,不然会导致内存泄露。

  • 数据库所有操作都必须放到子线程中执行。