前言
Android中使用SQLite做为数据库,当数据量很大的情况下,就可能会出现性能问题,比如查询速度过慢,更新速度过慢等,因此需要对其进行优化。
优化方法
使用事务
每次事务都会修改rollback journal文件,因此比较耗时,对于批量操作,应该合并到同一个事务中。
建立索引
对查询多,更新少的字段建立索引,但索引会占用空间,而且会降低更新速度。
使用SQLiteStatement
对于循环执行数据库操作,应该在循环外预编译好sql语句得到SQLiteStatement对象,然后循环内bindXXX,而不是直接在循环内调用execSQL方法,这样会导致创建大量的SQLiteStatement临时对象,而且每次都会重新编译sql语句。
缓存getColumnIndex返回结果
对于循环执行数据库操作,getColumnIndex方法应该放到循环前调用,而不是每次循环都调用一次,虽然该方法的本质是从Map中查找index,但对性能还是有一定的影响的,放在循环前调用会稍微快一些。
Cursor优化
正如微信的WCDB所说,在合适的场景下,直接把Cursor的共享内存缓存去掉,会提高数据查询的速度。
分表、分库
SQLite的同步锁是表级别的,因此为了避免等待,可以按照具体场景拆分为多个表,或者分库。
SQL语句拼接
不要用+进行连接,用StringBuilder,有循环的最后放到循环外部,不要每次循环都去生成sql语句字符串。
SQL语句优化
适用所有数据库优化,不仅仅只是SQLite,见下部分。