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的方法的源码就好(因为源码中这个方法代码有点小多,截关键代码的图):

《sqlite 操作速度优化浅谈》 图片.png

这里看标出的关键代码,fmdb已经帮我们封装好存储过程的代码,我们只要把shouldCacheStatements设置true就可以开启存储过程了,这里就不再深入看FMDB的代码了,有兴趣的可以深入阅读。

关闭写同步

关闭写同步的时候,应用异常退出时可能导致数据的丢失,这个在移动应用出现异常的概率还是比较大的,直接kill应用等,都有可能导致数据丢失,这里就不细说了,有兴趣的自己去搜索相关的内容看看。

总结

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

    原文作者:YxxxHao
    原文地址: https://www.jianshu.com/p/f0c614e93ba2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞