本文以INSERT为例介绍影响SQLite3速度的方法。
基本方法
SQLite3执行INSERT语句的代码如下:
for (int i=0; i<count; ++i) {
const char *stmt = “INSERT INTO TABLE VALUES(....)”;
sqlite3_exec(db, stmt, 0, 0, 0);
}
开启事务
事务保证数据库执行语句的完整性,是开销较大的动作。每次INSERT语句隐式开启一个事务,多次INSERT语句则会开启多次。显示开启事务可以合并多次INSERT语句的事务,如下:
sqlite3_exec(db,"BEGIN;",0,0,0);
for(int i=0; i<count; ++i) {
const char *stmt = “INSERT INTO TABLE VALUES(....)”;
sqlite3_exec(db,ssm.str().c_str(),0,0,0);
}
sqlite3_exec(db,"COMMIT;",0,0,0);
设置同步
设置synchronous选项,可选值为full、normal、off,默认为full。其值full最安全但最慢,而off最快但数据库存在损坏风险。
sqlite3_exec(db,"PRAGMA SYNCHRONOUS = OFF; ",0,0,0);
执行准备
如果执行相同的语句,只是数据不同,如INSERT不同的数据项,可预先对执行语句进行预处理。
sqlite3_stmt *stmt;
const char* sql = "INSERT INTO TABLE VALUES(?,?)";
sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,0);
for(int i=0; i<count; ++i) {
sqlite3_reset(stmt);
sqlite3_bind_int(stmt,1,i);
sqlite3_bind_double(stmt,2,i*i);
sqlite3_step(stmt);
}
sqlite3_finalize(stmt);