Android应用程序开发时经常要使用到数据库做本地存储,因此优化SQLite是优化程序性能的一个很重要的部分。
本文从以下3个方面说一下数据库的简单优化手段:
1.提前编译sql语句
2.事务
3.映射
一.提前编译sql语句
假设我们现在需要向数据库中插入若干条数据,我们当然可以这么写
String sql = "insert into student(id,name) values('1','zhangsan')";
db.exeSQL(sql);
好的,没有问题,那么当数据多的时候呢?貌似也没问题,使用stringbuilder将字符串拼接起来就行了:
int i = 0;
StringBuilder builder = new StringBuilder();
bulider.append("insert into student(id,name) values(\"");
int resetLength
for(String name: names) {
bulider.setLength(resetLength);
bulider.append(i++).append("\",\"").append(name).append("\")");
db.exeSQL(bulider.toString());
}
嗯,看起来没什么问题,可是有兴趣的朋友可以试一试,执行起来效率并不好,原因是什么呢?其实每次执行db.exeSQL的时候都会对sql语句进行编译(解析)过程,上述操作其实是做了n次编译,所以效率并不好,一种提升效率的方法是使用compileStatement让语句现在循环外面编译,这样就只需要进行一次编译即可。
代码如下:
SQLiteStatement stmt = db.compileStatement("insert into student(id,name) values(?,?)");
int i = 0;
for(String name: names) {
stmt.clearBindings();
stmt.bindString(1,i);
stmt.bindString(2,name);
stmt.executeInsert();
}
上述代码由于在循环外先进性了sql语句的编译,所以明显优化了很多。有兴趣的朋友可以试试。当然,上述写法还存在一个问题,就是sql语句以及固定地写在了statement里面,如果这个时候想要执行删除操作就显得不方便了,实际使用中推荐使用ContentValues来执行sql语句,不仅灵活,效率上也很好。
二.事务
事务这个概念相信接触过数据库的同学肯定不会陌生了,其实sqlite在执行添、删、改这类sql操作的时候会默认地开启一个事务,那么大家想想,开启事务是需要耗时的,上述操作如果循环执行1000次,那就进行了1000次的额外操作,效率自然不好,所以正确的做法是在进行大量的添、删、改操作时显示地加上开启事务语句,这样只进行了一次额外的操作,效率自然不可同日而语了。代码如下:
try {
db.beginTransaction();
SQLiteStatement stmt = db.compileStatement("insert into student(id,name) values(?,?)");
int i = 0;
for(String name: names) {
stmt.clearBindings();
stmt.bindString(1,i);
stmt.bindString(2,name);
stmt.executeInsert();
}
db.setTransactionSuccessful();
} catch(Exception e) {
//do sth.
} finally {
db.endTransaction();
}
上述优化的方法操作简单,见效快,使用范围广,对于大量sql操作都可以通过加上事务操作来进行性能优化。强力推荐!
三、映射
该优化方法相信大多数朋友都知道,就是在查询的时候只查询需要的列,这样可以避免不必要的查询,能够极大的优化效率。
好了,今天就说到这里。以上是我所知道的数据库优化的方法,相信还有很多不少优化数据库的方法,也希望大家多多交流,将性能优化进行到底~