本文给大家分享的是个人在实际项目中对于sqlite的一次优化的记录,非常简单实用,希望对大家学习sqlite能够有所帮助。

最早接触 iOS 开发了解到的第一个缓存数据库就是 SQLite,后面一直也以 SQLite 作为中坚力量使用,以前没有接触到比较大量数据的读写,所以在性能优化方面关注不多,这次对一个特定场景的较多数据批量读写做了一个性能优化,使性能提高了十倍。

大致应用场景是这样:

每次程序启动会从服务器拉取一些数据,对本地数据库两个表进行同步更新,不存在就写入,存在就更新其字段。数据少的时候几十条,多的上千条。

由于缓存的数据可能会存在异步同时读写,所以做了一个后台同步队列,所有的缓存数据库操作都在这个队列里面,然后我监控了一下写数据库的关键代码执行耗时,一千条数据更新到数据库就能耗时 30 秒之久,磁盘写入在 1.5M/s 浮动, 虽然没有卡主线程,这个消耗即使在后台也是不可容忍的。

核心的数据库操作大概是这样的

for 1000 : {Select -> Update Or InsertSelect -> Update Or Insert}

由于牵涉到两张表,所以会有两次,经过测试,Select 一次几乎没有多少消息,可是 Update 或者 Insert ( [FMDatabaseQueue executeUpdate:] ) 就消耗大了,因为会写入磁盘,然后想到是不是可以把所有的 SQL 语句拼接起来,最后只想一次;再后来想到 SQLite 不是有事务 ( Transaction ) 嘛,于是尝试了一下利用 FMDB 的事务操作,在循环开始前 [db beginTransaction] ,循环结束 [db commit],包起来就行了。

增加事务之后的大概逻辑:

beginTransactionfor 1000 : {Select -> Update Or InsertSelect -> Update Or Insert}commit

测试效果非常好,整个耗时从 30 秒下降到了2.8 秒左右,仅仅增加了两行代码。

总结:

踩过的坑,走过的坎,都是以后的经验

虽然利用事务取巧来提高了性能,但是这样做其实并不安全,好在所属场景对这部分数据绝对一致要求不是太高。
模拟器和真机有时候测试并不能重现同一个问题,因为所属架构、CPU、硬盘都不一样,所以性能测试最好还是以真机为准。该问题测试的时候在模拟器上很多问题都没有,因为硬盘比真机读写速度要高,所以避免了很多问题,测试的时候也就没有发现。

数据库设计设计的时候得多考虑考虑,多想想以后怎么扩展,怎么升级,读写的时候性能怎么样。

分享一个SQLite 性能优化实例相关推荐

  1. 记录一个android性能优化宝藏级总结

    发现一个android性能优化文章宝藏级总结,太赞了,感谢大佬的无私奉献总结,防止丢失,在此记录一下 传送门 复制一些目录,增加一些篇幅{嘻嘻} 优化心得和经验 抖音 Android 性能优化系列:启 ...

  2. SQLite 性能优化

    SQLite性能优化 主要通过pragma指令来实现. 比如: 空间释放.磁盘同步.Cache大小等. 不要打开.前文提高了,Vacuum的效率非常低! PRAGMA auto_vacuum; PRA ...

  3. apache php 调优_Apache的性能优化实例(一)

    本文主要和大家分享Apache的性能优化(一),希望能帮助到大家. Apache缺省的最大用户数是256个:这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置,但随着内存成本的急剧下降 ...

  4. 老李案例分享:Weblogic性能优化案例

    老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...

  5. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  6. Web前端教程分享:页面性能优化办法有哪些?

    引子 互联网有一项著名的8秒原则.用户在访问Web网页时,如果时间超过8秒就会感到不耐烦,如果加载需要太长时间,他们就会放弃访问.大部分用户希望网页能在2秒之内就完成加载.事实上,加载时间每多1秒,你 ...

  7. 分享一个windows 10优化用的注册表

    转摘于http://wuyou.net/forum.php?mod=viewthread&tid=413465 分享一个自己用的windows 10优化用的注册表,再也不用点来点去了... 开 ...

  8. sqlite性能优化

    1.数据库性能上 1.1 批量事务插入,提升数据插入的性能 由于sqlite默认每次插入都是事务,需要对文件进行读写,那么减少事务次数就能简书磁盘读写次数从而获得性能提升. 1.2 单条sql优于多条 ...

  9. 【每日一练 085】性能优化-实例优化(四)

    墨墨导读:本文出自墨天轮"每日一练"专栏,此专栏已连更84天,欢迎关注https://www.modb.pro/topic/26446(复制到浏览器中打开或者点击"阅读原 ...

最新文章

  1. http路径转file会变成反斜杠_PHP session反序列化漏洞
  2. ERP云端争霸 甲骨文和SAP打对攻 金蝶忙转身用友原地等待
  3. 喜报!神策数据荣获“2019 银行业数字营销大赛”智能营销类金奖
  4. YOLOv2和YOLOv3效果对比
  5. sklearn 线性回归_使用sklearn库做线性回归拟合
  6. mysql+distinct+max_MySQL中distinct与group by之间的性能进行比较
  7. 项目周期一般多久_深圳app开发公司的软件开发要多久?
  8. 古风祥云PNG免抠素材,喜欢吗?
  9. Oracle 隔离级别
  10. LR(1)项目集族的构造:如何确定前向搜索符
  11. LayoutInflater 总结
  12. 日本性价比旅馆分析报告
  13. 4G模块ME909S-821调试记录
  14. 计算机测试的论文,软件测试毕业论文-软件工程论文-计算机论文.docx
  15. 【花雕小实验01】使用万用表测量OPT101模拟光照传感器模块
  16. 定弘法师(钟茂森博士)的九大愿
  17. speedoffice和office的区别
  18. 把图片修改为单色图片
  19. 华为交换机基础命令配置
  20. 利用cmd(命令提示符)安装mysql配置环境

热门文章

  1. 重上热搜!北师大教授:给非洲留学生1年10万奖学金真的不算多!
  2. 【微软出品】AI-神经网络基本原理简明教程
  3. 漫画:有趣的“帽子问题”
  4. 面试官问:请拿出一段体现你水平的代码,我该如何回答?
  5. CentOS7修改时区,你会吗?
  6. ptrace原理与性能对比
  7. Linux内核网络栈1.2.13-af_inet.c概述
  8. 传统图像处理与深度学习又一结合:时空多尺度非局部自相似集成视频超分
  9. 链表问题14——在单链表种删除指定值的节点
  10. 2018 百越杯 pwn(Boring Game Write up)