世界上装机量最大的数据库SQLite,低调但不小众
SQLite简介
SQLite是世界上装机量最大的数据库。仅仅你的手机里,就运行着许多个SQLite实例。它也是微信的客户端数据库,里面保存了你的聊天记录、联系人、设置等等关于微信的几乎一切数据。根据SQLite的官方统计,目前正在使用的SQLite数据库实例超过了1万亿个。
SQLite是一个轻量级的嵌入式关系型数据库。它使用C语言开发,最初的设计目的是应用在嵌入式系统里面。它可以在不需要服务器的情况下,直接嵌入到一些物联网设备,比如家电、路由器、汽车等,作为本地数据库使用。智能手机当然也正好契合SQLite的使用场景。
为什么说你的手机上肯定有SQLite呢?因为SQLite会随着应用程序一起打包,你每安装一个APP,都有可能部署一个SQLite的本地数据库。
本期视频,我们以微信为例,深入探究一下这个神奇的数据库。看看微信客户端为什么要使用这么一个数据库,还有它的库结构、表结构到底是什么样的。
SQLite的优势
SQLite作为一个嵌入式的数据库系统,它的最大优点是轻量级。我们来看一下官网,这里的安卓版只有3.44兆大小。
我们可以看一下,这里还有Windows版本的,
这种DLL动态链接的只有一兆左右,这种带可执行文件的是4.8兆。
我们把它下载下来看一下。下载好以后一个exe文件打开就用,没有比这个更简单的配置数据库的方法了。
SQLite的基本操作
我们简单来试用一下。这里我使用第一个命令打开一个新的数据库,如果没有的话,他会创建一个。我们输入这个命令:.open newDatabase.db
。桌面上多了一个文件,也就是我的数据库文件。所有的表的信息都会存到这个文件里面。
然后我们就可以使用标准的SQL语法。首先我们先建一个表,这里我新建一个student表。然后我们往student表里插一条数据,名字叫做汤姆。接下来我们就可以查询这个表了,这里我select * from students
,这样表里数据也查出来了。
SQLite的功能特性
不要被它名字里的lite所迷惑,SQLite是一个全特性的SQL数据库。它有表、索引、视图等功能,而且不限制数量。它支持多列索引、倒序索引、部分索引、索引表达式,还有聚群索引等等。
SQLite还完全支持ACID,这里指的是原子性、一致性、隔离性跟持久性。它可以使用Begin、Commit还有Rollback等实现数据库的事务操作。它的SQL语言也非常的强大,甚至比MySQL早4年就开始支持with语句,可以说是麻雀虽小五脏俱全。
SQLite的查询性能
SQLite的查询速度也非常的快。比如我们微信上常用的这个用关键词搜索聊天记录的功能,它的查询速度其实非常惊人,完全不逊色一些专业的全文搜索数据库。对这块技术感兴趣的观众,可以看一下这篇文章。
我们进入微信的搜一搜,搜索这篇文章"微信全文搜索技术优化"。
这是腾讯官方号写的一篇文章,里面讲述了微信团队是如何极限压榨SQLite的FTS5全文搜索引擎。通过这些技术,微信最终实现了把几百GB的聊天记录的全文搜索速度压缩到了毫秒级。
SQLite的局限性
当然这个数据库也不是全能的。作为一个嵌入式数据库,通常以单用户模式运行,在处理多用户大量并发读写请求时,性能可能存在不足。相比之下,传统的客户端-服务器架构的数据库,比如MySQL或者PostgreSQL,可以更好的处理大规模并发请求。如果有多个客户端需要同时访问同一数据库,那么最好还是使用传统服务器数据库。
SQLite图形化工具
除了命令行操纵SQLite以外,我们还可以使用图形化的软件。这里我推荐的软件使用这个SQLite Browser,
这是一个Github上的开源项目。我们找到这里的release,把对应的安装包下载下来。这里展开这个asset,我下载这个Windows 64位的安装包安装到电脑上。
安装好以后我们把它打开,这是一个完整的图形化界面。我们在左上角的文件打开数据库,这里我来演示一下刚才我新建的那个数据库。可以看到,我刚才建的那个student表就在这里。点击右键可以浏览表的记录,
当然也可以执行SQL语句,往表里插入记录等等。
这里我再插入一条,点击这个执行按钮就可以执行,
然后点击写入更改,把事务提交上去。这个软件的功能跟我们常用的一些数据库图形化软件,比如Navicat等等功能是一致的。
导出和查看微信数据库
下面我们来看如何导出并且查看微信数据库。这次我使用的开源项目叫做pywxdump,
这是一个可以导出PC端微信数据库的程序。好我们还是找到它的release,这里找到这个可执行文件,
我们把它下载下来。
下载好以后,我们登录一下电脑端的微信客户端,然后我们开启一下作者这个程序。这里点击更多信息,点击仍要运行。这里打开了一个网页,我们按照提示进行操作。点击这个自动解密已登录微信,这里显示初始化成功,那微信的数据库就被导出了。
我们可以在左侧查看聊天记录。这里我的重点还是SQLite,我们找到这个文件夹wxdump....,进来以后找到自己微信ID命名的这个文件夹,这里有一个merge_all.db,这个就是SQLite的数据库。
微信数据库表结构分析
我们还是使用刚才介绍的DB browser看一眼里面的内容。可以看到这里面有非常多的表,
作者项目的这个doc文件夹里面有一个数据库简述,大约介绍了这些表都是做什么用的。这里我挑几个比较有意思的跟大家分享一下。
Contact表
首先是这个contact表,顾名思义就是联系人。
不过这里的联系人不是指你的好友,而是指所有你可以看到的人,除去好友外,还可以看到群聊里面的陌生人。
我们来看一下contact的表,这个表里面有很多个字段。
这里我找了一条记录,这个是我爬爬虾小助理的这个微信号。我们可以看到第一列username wxid开头的,
应该是微信在腾讯那边的唯一ID。是我这个账号自己起的一个英文名,然后还有个encrypt username,这个应该是加密后的英文名。这里的Nike name是它的中文名,然后这里的Remark是我对这个账号的备注。这里的delete flag应该表示的两个人的好友关系,你是否删除了这个好友。这个reserve的字段是些保留字段,可能以后会有什么别的用处。还存了一些汉语拼音的信息。
Msg表
下一个表是这个msg表,
这个是聊天记录的核心表。我们来看一下这个表,我们先看这个talker ID,这里对应的就是微信的唯一ID。这里我过滤出爬爬虾小助理跟我说过所有的话,这里的string contact就是我们两个人聊天的内容。
还有一个有意思的字段是is sender,如果issender是1的话,表示我给他说的话,如果issender是0,表示他给我说的话。这里还有一个字段叫做create time,应该是我们聊天那个时间点的时间戳,是毫秒级别的。
还有一个Type跟Subtype字段,表示聊天记录的类型。一的话是最简单的文本,3对应图片,34对应语音,43对应视频,47对应动画表情等等等等。作者也是研究的非常的细。
Chat Room表
下一个有意思的表是这个chat room,
翻译过来是聊天室,也就是你加过的群。首先chatroomname,这是一个唯一的ID。usernamelist,这里面列出了这个群里面有哪些用户。display name list,这里列出了在群里每个用户给自己取的群昵称是多少。还有一个self display name,这里是你自己在群里给自己取的昵称是多少。
其他表
数据库里还有很多其他类型的表,比如这个emotion就是微信表情包相关的表,这里的SNS是微信朋友圈相关的数据,这里的favorite跟收藏相关的数据,还有跟微信配置有关的数据等等等等,都可以在这个数据库里面找到。这里我就不详细介绍了。
聊天记录导出
刚才我讲到了微信查看数据库内容还有聊天记录的数据库表,自然而然我们就可以想到可以把这个数据库表生成成一份可以导出的文档,比如html或者PDF等等。这个开源项目叫做留痕,
就是可以导出微信聊天记录的。这个开源项目,这里爬爬虾之前有一个详细视频介绍这块内容,感兴趣的观众可以找来看一下。