最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
开启左侧

一个数据库外行眼中的微信优化 (附专家补充)

[复制链接]
发表于 2016-1-30 10:11:43 | 显示全部楼层 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
作者:黄亮、王君
引言:由于微信的一个版本升级,我曾经乐观地认为更换手机的时间也许可以推迟个一年了…
然而很快我就发现高兴得有点早。本文最初撰写于元旦期间,而在一周之前升级Android微信6.3.9时,这样一个以往没出过问题的常规操作使我再次遭遇意外——微信启动时停在那个地球就不动了。想用低版本6.3.8覆盖安装不允许(我记得某个版本之前是支持的),而且微信一旦卸载重装用户数据又无法保留。在包括清除缓存在内的尝试无效之后,我选择了清除应用数据,代价是包括几百条未读信息在内的所有聊天记录都和我说再见了。不知下一次能坚持到什么时候?
注:本文讨论的都是针对Android手机,像我这样的屌丝用户也听说过iPhone版本使用体验不在一个层面上。
这次主要想跟大家聊聊微信最近在功能和性能上的一些变化,以及我遇到的一些问题,可以看出它们中的许多都跟数据库有关。首先声明下我是数据库外行,班门弄斧地撰文本文更多是希望能抛砖引玉,同时我也附上了一位专家朋友在微信数据库修复等方面的经验和思考,大家如有不同见解、感想欢迎在文章结尾处留言:)
微信越用越慢怎么办?
在Android微信版本是6.3.8推出之前,我发现微信明显越用越慢,不时就会考虑下该什么时候升级手机。

大家知道,伴随版本升级微信的功能越加越多,耗资源特别是内存不断增大,速度也越来越慢。最初我用的小米1GB内存手机,有的微信群聊天记录多了,在里面点一张图片,甚至要等上半分钟到一分钟才能打开。此时如果左右移动到前面或者后面的图片很流畅,但是只要一退出,再点另外一张图片又要经过漫长的等待…

上次听到有位DBA朋友说他的微信数据库坏了,手工修复的文件(结尾处有经验分享)。记得当时这位兄弟还坚持用512MB内存的手机,Android版本2.3升级到微信5.x就上不去了,他的勤俭和钻研精神令人敬佩!根据我比较有限的数据库知识,猜测在这个轻量级的sqlite数据库中,每个好友和群的聊天记录都存放在一个单独的表里。每当打开其中的图片时,就要遍历该会话历史消息中的全部对象,因此这个时间就和聊天记录的多少成正比了。
当时我也想过,在程序上有没有优化的办法?也许微信是在权衡着一些什么。

也许有朋友用过这个“清理微信存储空间”的功能,它能够针对每个会话来操作——不过如果我没记错的话只处理图片、视频和表情等对象,对于文字聊天记录都是保留的。也就是说,并不能使数据库减负。

由于有些聊天记录不忍删除,我的手机越用越慢,甚至打开图片的过程中微信有时会自动退出。后来等到家人换手机,我升级用1.5GB内存的三星,该问题暂时得到缓解。但随着聊天记录的增长,打开图片的时间又慢慢增加了,以至于我常常在想这个手机还能撑多长时间。

如果点下这个,就和我现在差不多,一夜回到解放前了

索引优化?打开图片顽疾解决
到了Android 6.3.7版本,由于加入了群公告等,我的微信已经慢得不行。随后发布了一个号称改善速度的小版本,确实好了一点,而真正的显著变化在后面。

微信6.3.8的菜单里增加了这个“聊天文件”,一方面可以统一查看会话里的图片、视频和超链接对象,还把之前打开图片慢的问题也解决了。

究其原因,估计是给每个会话的表里建了一个索引?收到新的对象只要更新这个索引即可,这样即无需每次打开图片都遍历一篇所有对象了。
与此同时,整个微信的速度也流畅多了,也许我这1.5GB内存Android机再撑个1-2年问题不大了?记得以前每个Windows新版本经常会带动PC硬件的销售(由于流畅运行的配置提高),那么这次微信的优化,会不会影响到高端手机的销售呢:)
快速迭代新增问题、备份方式与性能
要说6.3.8这个微信版本更新,也是有一点遗憾。比如有朋友反映收藏夹内的视频,如果之前没有下载到本地(即在聊天会话中打开播放过)的话就无法打开,我也遇到了。初步分析,应该是在收藏时把对象链接指向到本地的位置了,因此如果没下载过就放不出来。
该问题已经在6.3.9中得到较好地处理,在第一次收藏视频对象时会有一个“需要先下载到本地”的提示。
再回到本文开头我遇到的问题,也许有朋友问我为什么没备份?说实话,可能是因为数据库功能简单,微信备份的体验并不是太好。

我一般是用PC版客户端来做这个备份,根据上图中的数据量级别和花费时间(数十分钟),应该可以判定是逻辑导出式备份,sqlite没有Oracle RMAN那样的强大备份工具也可以理解。但我在这个备份上遇到失败的次数多了点,感觉和手机配置乃至Android版本都可能有关。


上图界面,是微信的手机 to 手机备份功能。虽然应该也是逻辑复制,但这个的速度经过我实测还是要比备份到电脑要快不少,而且一次成功。

可能是由于互联网产品的快速迭代,在时间积累上远不如QQ的微信又加了较多的功能,Android版每隔一段时间就会给我点小意外。就其长期不清理运行的健壮性方面,我认为还没有达到张小龙所说“用完即走”的程度。也许对这样一个免费聊天工具,我们不应该要求太多,因为它已经在与微博等的pk中完胜,占据了我们这么多的碎片时间:)
专家补充:微信数据库修复、更多思考(by王君)
iPhone版本的微信数据库是否未加密?加密与性能的问题;
sqlite损坏时,安卓的根分区(/分区)下备份数据库(EnMicroMsg.dberr时间戳)的数据库解密与恢复;数据库损坏的发生:在http://www.sqlite.org/docs.html页面,How Database Corruption Can Occur;
资源(视频、图片、声音等)文件的数量,是否过于零碎,导致速度缓慢;
微信是32位还是64位程序;
http://www.sqlite.org/docs.html页面,影响sqlite速度的大致有In-Memory Databases(微信是否使用)、R树(是什么)、索引;
微信Sqlite加密,使用开源的sqlite cipher。密码与个人信息有关。
微信数据库恢复基本流程:找到EnMicroMsg.dberr时间戳文件,解密,恢复数据库。修改文件名为MicroMsg.db,放回安卓的根分区下微信目录内,运行微信,5.x以上版本微信将自动加密为EnMicroMsg.db。
后记:我一直担心因为本文不够专业而给大家造成误导,故反复修改迟迟未能发布出来。日前微信又推出了新版本6.3.11(我还没升级),要是再不发真的就过时了:)
via:企业存储技术

楼主热帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-4-18 14:38

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表