SQLite 性能优化实例分享

 更新时间:2016年02月14日 10:47:19   投稿:hebedich  
本文给大家分享的是个人在实际项目中对于sqlite的一次优化的记录,非常简单实用,希望对大家学习sqlite能够有所帮助。

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

大致应用场景是这样:

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

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

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

for 1000 : {

Select -> Update Or Insert

Select -> Update Or Insert

}

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

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

beginTransaction

for 1000 : {

Select -> Update Or Insert

Select -> Update Or Insert

}

commit

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

总结:

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

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

相关文章

  • SQLite教程(九):在线备份

    SQLite教程(九):在线备份

    这篇文章主要介绍了SQLite教程(九):在线备份,本文讲解了常用备份方法、在线备份APIs简介、高级应用技巧等内容,需要的朋友可以参考下
    2015-05-05
  • SQLite教程(二):C/C++接口简介

    SQLite教程(二):C/C++接口简介

    这篇文章主要介绍了SQLite教程(二):C/C++接口简介,本文讲解了C/C++接口概述、核心对象和接口、参数绑定等内容,需要的朋友可以参考下
    2015-05-05
  • SQLite 实现if not exist 类似功能的操作

    SQLite 实现if not exist 类似功能的操作

    这篇文章主要介绍了SQLite 实现if not exist 类似功能的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • ubuntu下使用SQLite3的基本命令

    ubuntu下使用SQLite3的基本命令

    sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在为熟悉sqlite3基本命令提供技术文档。希望对读者们有所帮助,如有疑问请和我联系,尽可能解答
    2014-08-08
  • SQLite教程(十二):锁和并发控制详解

    SQLite教程(十二):锁和并发控制详解

    这篇文章主要介绍了SQLite教程(十二):锁和并发控制详解,本文讲解了锁和并发控制机制概述、文件锁、回滚日志、数据写入、SQL级别的事务控制等内容,需要的朋友可以参考下
    2015-05-05
  • SQLite 入门教程三 好多约束 Constraints

    SQLite 入门教程三 好多约束 Constraints

    在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应该翻译成约束更贴切一点。 那么什么是约束呢
    2013-12-12
  • SQLite中的WAL机制详细介绍

    SQLite中的WAL机制详细介绍

    这篇文章主要介绍了SQLite中的WAL机制详细介绍,本文讲解了什么是WAL、WAL如何工作、WAL的优点与缺点、WAL引入的兼容性问题、WAL引入的性能问题等内容,需要的朋友可以参考下
    2015-01-01
  • SQLite教程(十):内存数据库和临时数据库

    SQLite教程(十):内存数据库和临时数据库

    这篇文章主要介绍了SQLite教程(十):内存数据库和临时数据库,本文讲解了它们的创建方法和相关知识,需要的朋友可以参考下
    2015-05-05
  • Sqlite 常用函数 推荐

    Sqlite 常用函数 推荐

    Sqlite 常用函数,在实际开发中,经常遇的到。
    2009-09-09
  • VScode第三方插件打开sqlite数据库图文教程

    VScode第三方插件打开sqlite数据库图文教程

    在实际做一个项目的时候,为了提高效率我们会首选不重复造轮子,所以可能会用到第三方库,下面这篇文章主要给大家介绍了关于VScode第三方插件打开sqlite数据库的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06

最新评论