近期换了工做,新公司在数据持久化的方面的技术栈用到了MongoDB,遂有了这篇内容,旨在学习Mongo的同时,对Mongo的一些设计进行刨析分解。本篇主要侧重于MongoDB的索引存储策略与传统关系型数据库Mysql的对比与差别缘由。sql
谈及索引,对于目标检索的过程次数以及I/O
次数是存储结构权衡优劣的关键。在Mysql(Innodb)
中,咱们的聚簇索引、二级索引默认都是由B+树进行索引的存储管理。而在MongoDB中,则采用了B树进行索引的构建。对于两者的孰优孰劣暂不论定,咱们先得弄明白这两种数据结构的优点和劣势分别在哪。接下来内容可能会比较偏基础,关于Mysql
的部分我会配合着一些基础结构进行分析(由于目前更熟悉一点的仍是Mysql
)。数据库
B-Tree、B+tree能够说是为磁盘或其它存储工具而生,不一样于基础的二叉搜索树,B-树,B+树都有着矮胖的特征,而咱们都知道磁盘在读取数据时是以块为基础单位,矮胖的特征意味着一个盘块内能够存放更多的内容,在查找数据的过程当中得以减小盘块的读取次数。网络
B+树是Mysql(InnoDB)
的默认索引结构,包括聚簇索引和二级索引。而其存储的方式也很简单明了,Mysql
定义了不少种类型的页面以存放各类数据譬如说Undo日志页(FIL_PAGE_UNDO_LOG)、系统页(FIL_PAGE_TYPE_SYS)、段信息页(FIL_PAGE_INODE),还有咱们最基本的存放数据的页叫索引页或者数据页(FIL_PAGE_INDEX),而索引页中的数据,在数据头的数据结构有一个字段叫record_type
用于标注数据类型,0表明非叶子节点记录,1表明普通记录。听到这里是否是比较熟悉,让咱们来看看一个Mysql
存放一张表的数据结构是怎样的。数据结构
基本的东西我已经在图上标出来了,虽然已经略去了不少信息,可是大致结构你们能够意会一下。能够从图上看到数据之间经过指针关联,在叶子节点页面间也经过指针关联,主键有序排列,这就是咱们Mysql
数据存储数据所构建的一个聚簇索引,二级索引把主键替换为索引列,数据替换为数据主键就行了。从大致结构上看就是一个标准的B+树,即非叶子节点只存放主键范围,而叶子节点存放主键和数据,叶子节点间经过指针相互链接。经过以上结构咱们也能够看出一些问题。工具
O(logn)
B+树实际上是基于B树的矮胖基础形态下,添加了【非叶子节点不存储具体数据内容,只存放索引】、【叶子节点存放所有数据并使用指针链接】两种特性。换句话说,B树的全部节点都存放数据,节点的左子树小于当前节点值,右子树大于当前节点值。学习
MongoDB
是一种面向文档的数据库管理系统,与传统关系型数据库譬如Mysql
不一样的是Mysql
的数据是扁平化的,构建结构化的数据每每须要经过连表查询在业务中进行组合。而MongoDB
是面向文档的数据库,数据在存储阶段就是结构化的,聚合的。优化
咱们能够看一下Mongo的数据存储结构是怎样的(按照理解画的)。设计
Mongo在索引上也区分为主键索引和非主键索引,这方面与Mysql
的聚簇索引和二级索引相似,主键索引储存主键以及数据内容,非主键索引储存索引列数据以及主键。从数据存储结构图来进行分析,咱们大体能得出如下几个结论:指针
MongoDB
查询速度会比Mysql
更快MongoDB
的数据是结构化存储,全部的数据均可以以聚合的方式进行存储,对于数据的遍历需求并无关系型数据库那么高。在数据的存储底层,Mongo
使用的也是BSON(Binary Json)进行存储,在类型支持和网络传输效率上相较于Json也有了很大的提高。 本篇咱们从传统的关系型数据库和非关系型数据库的视角作了对比,了解了Mongo
在数据存储方面使用的结构,以及与关系型数据库在存储方面的差别。数据结构同技术同样没有优劣之分,适合的才是最好的。Mongo
做为非关系型数据库,在效率的综合考量上采用了b-tree和bson进行搭配使用,也在搜索速度上达到了一个不差的水平。日志
以上就是个人一个对于Mongo
的初步概览,后续对于Mongo的具体索引模式,以及一个索引优化的思路也会有些总结,对内容中有疑问、错误的部分也欢迎你们指正,交流。
最近换了工做,新公司从各方面来看都很好,我也须要花上一些时间精力去融入公司,融入项目。可能与年终总结中定下按期更新博客内容有些冲突,时间没有那么肯定。可是至少一月两篇的原创内容仍是会尽可能去保证的。2020年对于我来讲也是个新开始,总之,加油。