sqlite 操作速度优化浅谈

打开事务

作业是什么,那里就不详细说了,一句话总计下:要么全体执行,要么全体不执行。那里要求小心的是,sqlite里的sqlite3_exec()方法中,其实是隐式开启了工作了,相当于一条sql语句的作业,每执行几回sqlite3_exec()方法就开辟和倒闭三次工作,这样就大大的伸张IO了。所以当操作批量数量的时候,我显式开启事务,等举行完了再关闭工作,那样就足以大大方方回落IO了。上边以举个例子(那里整个因而FMDB来操作sqlite):

[currentDataBase beginTransaction];
BOOL isRollBack = NO;
@try {
    // 批量数据库操作 
} @catch (NSException *exception) {
    isRollBack = YES;
    // 数据操作异常,全部回滚
    [currentDataBase rollback];
} @finally {
    if (!isRollBack) {
        // 提交并关闭事务
        [currentDataBase commit];
    }
}

那里进入FMDB的源码来看下, 相信FMDB源码对大家来说都能读得懂:

- (BOOL)rollback {
    BOOL b = [self executeUpdate:@"rollback transaction"];
    if (b) {
        _inTransaction = NO;
    }
    return b;
}

- (BOOL)commit {
    BOOL b =  [self executeUpdate:@"commit transaction"]; 
    if (b) {
        _inTransaction = NO;
    }
    return b;
}

- (BOOL)beginTransaction {   
    BOOL b = [self executeUpdate:@"begin exclusive transaction"];
    if (b) {
        _inTransaction = YES;
    }
    return b;
}

实际上就是把sqlite的操作封装起来,给用户提供更便捷便宜的接口罢了,指出大家在第三方的车轮时,照旧看下外人怎么落实的,顺便也围观学习下。

关门写同步

闭馆写同步的时候,应用尤其退出时或许导致数据的遗失,那几个在运动应用出现十分的几率如故相比大的,直接kill应用等,都有可能导致数据丢失,这里就不细说了,有趣味的友爱去寻觅相关的始末看看。

存储进度

仓储进程,也来一句话统计:把sql编译存储好了,使用时直接执行,不需求再一次编译。基础知识网上一大堆,不懂自行检索去。

在sqlite里是通过 sqlite3_prepare_v2()
方法来编译sql的,那里一直看FMDB的实施sql的方法的源码就好(因为源码中那一个艺术代码有点小多,截关键代码的图):

图片.png

那边看标出的基本点代码,fmdb已经帮大家封装好存储进度的代码,大家只要把shouldCacheStatements设置true就可以打开存储进度了,那里就不再深入看FMDB的代码了,有趣味的可以深切阅读。

总结

总计就是索引不介绍,哈哈,欢迎来吐槽,SDK 开发群:127548419。 还有SDK
开发可以品尝运用NoSQL,下次分享下realm。

大力回顾起大学学过的那多少个数据基础知识,能体悟的数据库操作速度优化的处理有:事务、存储进度、索引(查询速度),心酸ing,感觉学过的东西都还给老师了,然后再查了瞬间资源,发现还有一个是写同步的操作。

多年来支出的SDK因为急需多量的数据库读写操作,所以尝试对数据库操作的速度举行优化,从java转到iOS,发现最强烈的变动就是和数据库的触发变少了,在iOS中动用数据库时基本都是最不难易行的增删改查,偶尔还加个索引什么的,其实在运动端很少存在太多量的数据库操作,那也是分裂平台有分裂特色。

网站地图xml地图