sqlite 操作速度优化浅谈

近来支出的SDK因为急需大批量的数据库读写操作,所以尝试对数据库操作的快慢举行优化,从java转到iOS,发现最引人注目标生成就是和数据库的接触收缩了,在iOS中选取数据库时基本都是最简单易行的增删改查,偶尔还加个索引什么的,其实在活动端很少存在太大批量的数据库操作,那也是差别平台有两样特色。

铆劲回看起大学学过的那么些数据基础知识,能想到的数据库操作速度优化的拍卖有:事务、存储进程、索引(查询速度),心酸ing,感觉学过的事物都还给老师了,然后再查了一下资源,发现还有一个是写同步的操作。

打开事务

工作是如何,那里就不详细说了,一句话总计下:要么全体履行,要么全部不执行。那里要求专注的是,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的操作封装起来,给用户提供更急速便宜的接口罢了,提出大家在第三方的轮牛时,照旧看下旁人怎么落到实处的,顺便也围观学习下。

存储进度

仓储进度,也来一句话总计:把sql编译存储好了,使用时一贯实施,不须要再次编译。基础知识网上一大堆,不懂自行检索去。

在sqlite里是因此 sqlite3_prepare_v2()
方法来编译sql的,那里一向看FMDB的施行sql的法门的源码就好(因为源码中那么些主意代码有点小多,截关键代码的图):

图片.png

那边看标出的主要代码,fmdb已经帮大家封装好存储进程的代码,大家若是把shouldCacheStatements设置true就足以开启存储进度了,那里就不再长远看FMDB的代码了,有趣味的可以深深阅读。

关门写同步

关门写同步的时候,应用越发退出时可能造成数据的遗失,这么些在移动使用出现非常的几率仍然相比大的,直接kill应用等,都有可能造成数据丢失,那里就不细说了,有趣味的和睦去搜寻相关的情节看看。

总结

小结就是索引不介绍,哈哈,欢迎来吐槽,SDK 开发群:127548419。 还有SDK
开发可以尝试选择NoSQL,下次分享下realm。

网站地图xml地图