数据持久化:微信数据库组件--WCDB

WCDBWeChat DataBase)

WCDB是微信团队开源的支持Android,也支持iOS,那当然也是会支持macOS的一个移动端数据库框架,FMDB估计做iOS的99.99%的都知道,是在SQLite的基础上封装的移动数据库框架,WCDB是微信团队提供一个高效、易用、完整的移动端存储方案。 它包含三个模块:

  1、WCDB-iOS/Mac
  2、WCDB-Android
  3、数据库损坏修复工具WCDBRepair

数据库对比

数据库名称 WCDB FMDB coreData Realm
优点 高效、易用、完整 基于sqlite开发,易用,容易上手 苹果内建框架,和Xcode深度结合,可以很方便进行ORM key-value的实现直接易懂,像使用NSDictionary一样使用Realm。并且ORM彻底,省去了拼装Object的过程
缺点 包比较大 需要大量的写sql语句,需要自己拼接Object,过程繁琐 稳定性也堪忧,很容易crash;多线程的支持也比较鸡肋 耦合性较高,Realm要求类继承RLMObject的基类。key-value数据库对较为复杂的查询场景也比较无力

可见,各个方案都有其独特的优势及劣势,没有最好的,只有最适合的。

微信团队的愿景

  • 高效;增删改查的高效是数据库最基本的要求。除此之外,我们还希望能够支持多个线程高并发地操作数据库,以应对微信频繁收发消息的场景。

  • 易用;这是微信开源的原则,也是WCDB的原则。SQLite本不是一个易用的组件:为了完成一个查询,往往我们需要写很多拼接字符串、组装Object的胶水代码。这些代码冗长繁杂,而且容易出错,我们希望组件能统一完成这些任务。

  • 完整;数据库操作是一个复杂的场景,我们希望数据库组件能完整覆盖各种场景。包括数据库损坏、监控统计、复杂的查询、反注入等。

WCDB基本特性

  • 易用 :WCDB支持一句代码即可将数据取出并组合为object。

- (Province *)getProvinceObjectWithProvinceId:(NSInteger)provinceID {

    //从数据库表中取出1行数据并组合成Province 对象,后面可加where,或者orderby ,limit条件限制

   Province *province = [self.database getOneObjectOfClass:Province.class fromTable:@"province" where:Province.provinceID == provinceID];

    return province;
}
  • 高效:WCDB通过框架层和sqlcipher源码优化,使其更高效的表现。

根据官方性能报告显示:WCDB和FMDB比较:读操作两者的性能差不多,但是在写操作和批量事务的时候,WCDB表现的非常优越,性能分别优于FMDB 28% 和 180% 。

  • 完整:WCDB覆盖了数据库相关各种场景的所需功能。

    1、加密:WCDB提供基于SQLCipher的数据库加密。

    2、损坏修复:WCDB内建了Repair Kit用于修复损坏的数据库。

    3、反注入:WCDB内建了对SQL注入的保护。

性能数据

官方给出了Demo和benchmark,用户比较FMDB和WCDB两者的性能,供开发者参考。本次测试的数据样本有30万条。

原始数据和macOS的数据请参考:Benchmark原始数据

Benchmark基于以下原则进行:

  1. 所有测试都在同一个设备上进行,并且设备不同时进行其他高性能损耗的任务。

  2. 测试的样本量“足够大”,以避免误差导致结果相差较大。

  3. 所有测试均在Release且不连接Xcode调试的状态下进行。

  4. 每个benchmark取5次与平均值的误差不超过±5%的结果。

  5. 数据库完全关闭后再打开进行测试,以避免缓存影响结果。

基本操作

1.1 Read

读操作性能测试:该测试为从数据库中取出所有数据,并拼装为object。

读性能.png

1.2 Write

写操作性能测试:该测试为将object的数据不断插入到数据库中(不使用事务)。

写性能.png

1.3 Batch Write

批量写操作性能测试:该测试为将object的数据批量插入数据库(使用事务)。

批量写.png

WCDB写操作和批量写操作的性能分别优于FMDB 28% 和 180% ,而读操作则劣于FMDB 5% 。

对于读操作,SQLite速度很快,因此封装层的消耗会占比较多。FMDB只做了最简单的封装, 而WCDB还包括ORM、WINQ等操作,因此执行的指令会比FMDB多,从而导致性能稍差于FMDB。但WCDB也通过一些优化手段减少这种差距。例如,通过IMP指针调用函数、部分操作No-ARC等等。

而写操作,WCDB也做了许多针对性的优化。例如,WAL模式下写入操作触发checkpoint时,不立即执行checkpoint,而是由一个checkpoint线程来完成,从而减少单次操作的耗时等等。

多线程

2.1 Multithread Read-Read

多线程读操作性能测试:该测试同时启动两个线程,分别从数据库中取出所有数据,并拼装为object。

多线程读.png

2.2 Multithread Read-Write

多线程读写操作性能测试:该测试同时启动两个线程,一个线程从数据库中取出所有数据,并拼装为object;另一个将object的数据批量插入到数据库中。

多线程读写.png

2.3 Multithread Write-Write

多线程写操作性能测试:该测试同时启动两个线程,分别将object的数据批量插入数据库。

多线程写.png

WCDB的多线程读写操作性能优于FMDB 62% ,而多线程读操作基本与FMDB持平。

FMDB在多线程写测试中,直接返回错误SQLITE_BUSY,因此无法比较。而基于SQLite的机制,WCDB的多线程写操作实质也是串行执行,但不会出错导致操作中断。

加密

3.1 Cipher Read

加密数据库读操作测试:该测试基于Baseline Read,并将数据库改为加密数据库。


加密读.png

3.2 Cipher Write

加密数据库写操作测试:该测试基于Baseline Write,并将数据库改为加密数据库。

加密写.png

加密操作分别会对读和写增加 28% 和 26% 的性能损耗。

3.3 Sync Write

数据库同步写操作测试:该测试基于Baseline Write,并在每次写入都同步等待完全写入到磁盘,即增加以下配置:

  • PRAGMA synchronous=FULL

  • PRAGMA checkpoint_fullfsync=1

  • PRAGMA fullfsync=1

同步写.png

同步写操作会大幅降低写操作的性能,但对于数据稳定有很强的保护作用,能够降低 50% 的数据库损坏率。推荐对重要的数据库开启。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341