sqlite数据插入效率
一、程序效率测试
时间相关接口:
int gettimeofday(struct timeval*tv, struct timezone *tz);
功能:得到从1970年1月1日0时0分0秒到现在的秒数。<可以利用该函数来计算一个程序的运行时间,只需在程序前后调用该函数,并用后来的函数时间减去开始的函数时间就可以。注意单位的转变。> 精度到微秒
参数:tv:获取到的秒数
结构体: struct timeval {
time_t tv_sec; /* seconds */ 秒
suseconds_t tv_usec; /* microseconds */ 微妙 1s=1000000us
};
tz:关于时区
结构体: struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */ 格林威治向西的分钟数
int tz_dsttime; /* type of DST correction */ 夏令时修正的类型
};
返回值:成功:0; 失败:-1
二、提高sqlite数据插入效率
1、开启事务机制
所谓”事务“就是指一组SQL命令,这些命令要么一起执行,要么都不被执行。
在SQLite中,每调用一次sqlite3_exec()函数,就会隐式地开启了一个事务,如果插入一条数据,就调用该函数一次,事务就会被反复地开启、关闭,会增大IO量。
如果在插入数据前显式开启事务,插入后再一起提交,则会大大提高IO效率,进而加数据快插入速度。
开启事务:BEGIN;/BEGIN TRANSACTION;
将事务的修改保存到数据库中:COMMIT; /END TRANSACTION;
2、关闭写同步(危险)
synchronous Pragma 获取或设置当前磁盘的同步模式,该模式控制积极的 SQLite 如何将数据写入物理存储。
在SQLite中,数据库配置的参数都由编译指示(pragma)来实现的,而其中synchronous选项有三种可选状态:full、normal、off。
full写入速度最慢,但保证数据是安全的,不受断电、系统崩溃等影响;
而off可以加速数据库的一些操作,但如果系统崩溃或断电,则数据库可能会损毁。
PRAGMA synchronous = OFF;
3、执行准备
事先将SQL语句编译好,然后再一步一步(或一行一行)地执行。执行时提高速度。
1)sqlite3_prepare_v2() 创建sqlite3_stmt语句对象;
2)sqlite3_bind_*() 绑定参数值到sqlite3_stmt;
3)sqlite3_step() 运行sql语句,可以是一次,也可以是循环执行;
4)sqlite3_reset() 重置sqlite3_stmt对象;
5)sqlite3_finalize() 销毁sqlite3_stmt对象。
例如:将文件插入到数据库中。
注:开启事务机制前后效率比较:(单位:秒)