一、sqlite3性能测试
1. 程序效率测试
时间相关接口:
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
可以利用该函数来计算一个程序的运行时间,只需在程序前后调用该函数,并且后来的函数时间减去开始的函数时间就可以。注意单位的转变。
普通插入
insert 19660 : time : 32s
开启事务机制
insert 19660 : time : 0.155288s
关闭写同步
//insert 19660 : time : 0.150166s
执行准备
insert 19660 : time : 0.026s
二、提高SQLite数据插入效率
1. 开启事务机制
所谓”事务“就是指一组SQL命令,这些命令要么一起执行,要么都不被执行。在SQLite中,每调用一次sqlite3_exec()函数,
就会隐式地开启了一个事务,如果插入一条数据,就调用该函数一次,事务就会被反复地开启、关闭,会增大IO量。
如果在插入数据前显式开启事务,插入后再一起提交,则会大大提高IO效率,进而加数据快插入速度。
eg:
开启事务
BEGIN;
将事务的修改保存到数据库中
COMMIT;
sqlite3_exec(db,"begin;",NULL,NULL,NULL);
sqlite3_exec(db,"commit;",NULL,NULL,NULL);
2. 关闭写同步
synchronous Pragma 获取或设置当前磁盘的同步模式,该模式控制积极的 SQLite 如何将数据写入物理存储。
在SQLite中,数据库配置的参数都由编译指示(pragma)来实现的,而其中synchronous选项有三种可选状态,
full、normal、off。
full写入速度最慢,但保证数据是安全的,不受断电、系统崩溃等影响;
而off可以加速数据库的一些操作,但如果系统崩溃或断电,则数据库可能会损毁。
关闭写同步
PRAGMA synchronous = OFF;
3.执行准备(事先将SQL语句编译好,执行时提高速度)
SQLite执行SQL语句的时候,有两种方式:
一种是使用sqlite3_exec(),该函数直接调用包含SQL语句的字符串;
另一种方法就是“执行准备”(类似于存储过程)操作,即先将SQL语句编译好,然后再一步一步(或一行一行)地执行。
如果采用前者的话,就算开起了事务,SQLite仍然要对循环中每一句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对象
代替sqlite3_exec()函数
int sqlite3_prepare_v2(
sqlite3 *db, //数据库连接对象
const char *zSql, //要编译的 SQL 语句
int nByte, //要编译的 SQL 语句的长度,如果是-1,则自动计算其长度
sqlite3_stmt **ppStmt, //编译后的 SQLite3 语句对象
const char **pzTail //未编译部分的指针
);
功能:
该函数将 SQL 语句编译成 SQLite 虚拟机指令,并将编译后的 SQLite3 语句对象存储在 ppStmt 指向的指针中,以备执行。
如果 pzTail 不是 NULL,则该指针将指向 SQL 语句中未编译部分的起始位置。
返回值:
成功,则返回 SQLITE_OK。
失败,则返回一个错误代码。
int sqlite3_bind_text(
sqlite3_stmt*, // SQLite3 语句对象
int, // 值占位符的索引,从 1 开始
const char*, // 文本值的指针
int, // 文本值的长度,如果是-1,则自动计算其长度
void(*)(void*) // 当值变成不需要时要调用的析构函数
);
功能:将文本值绑定到 SQLite3 语句对象中的值占位符上。
int sqlite3_step(sqlite3_stmt *pStmt);
功能:重置sqlite3_stmt对象
参数:
pStmt:prepare语句编译出的sql语句实例
int sqlite3_finalize(sqlite3_stmt *pStmt)
功能:销毁sqlite3_stmt对象