大数据存储技术选型(七)——MongoDB设计模式及索引优化

2020-05-22 00:00:00 索引 数据 数据库 方式 复合

关系数据库的时代

关系数据库的设计理念

假设你有一台车,你需要给它存起来,给它找个停车位。传统数据库的存储方式就相当于,把这个车的所有零件拆下来,放在存放对应零件的盒子里,需要用的时候,再把他们取出来组装。这种方式的存储数据一个显而易见的好处就是节省空间~

关系型数据库存储数据

MongoDB的设计理念

然而,MongoDB存储数据的方式则截然不同。同样是上面的停车的例子,这回需要停这辆车的时候,我们就直接把它怼进车库里,取的时候直接就开走了。这样的存储数据的方式的好处是方便随时快捷地存取,但是会牺牲一些存储空间。

MongoDB的存储理念

索引原理

在MongoDB中主要有五种类型的索引,即单字段索引(Single-field Indexes)、复合索引(Compound Indexes)、多键索引(Multikey Indexes)、地理位置索引(Geospatial Indexes)和全文索引(Text Indexes)。

数据结构与算法复习

由于B树/B+树的工作过程过于复杂,我们用数组来理解它。假设索引为{a:1}(aASC):

db.table.insert({a: 1}) [1]

db.table.insert({a: 10}) [1, 10]

db.table.insert({a: 5}) [1, 5, 10]

db.table.insert({a: 7}) [1, 5, 7, 10]

db.table.insert({a: 3}) [1, 3, 5, 7, 10]

如上面工作过程所示,

1、数据增加/删除时始终保持被索引字段有序

2、数组插入效率太低,但B树可以轻(fu)松(za)实现

3、在有序结构上实施二分查找,可实现O(log2(n))高效搜索

Big O Notation——大O符号


理解复合索引

假设索引为{a: 1, b: 1} (a ASC, b ASC):

db.table.insert({a: 1, b: 1}) [{a: 1, b: [1]}]

db.table.insert({a: 1, b: 10}) [{a: 1, b: [1, 10]}]

db.table.insert({a: 5, b: 10}) [{a: 1, b: [1, 10]}, {a: 5, b: [10]}]

db.table.insert({a: 5, b: 7}) [{a: 1, b: [1, 10]}, {a: 5, b: [7, 10]}]

复合索引的创建就是这样一种层层嵌套的方式去建立的。

我们查询数据的时候,也是在各个对应的层级中找到索引所对应的数据。




复合索引的工作模式——过滤

我们通过下面的三张图来了解一下复合索引如何找到相应的数据页吧

如上图所示,我们可以查找数据时,就可以在已建好的索引上,通过不同节点的跳转,找到对应的数据页,再而找到对应数据页上的相关数据。


复合索引的工作模式——排序

由此可知,我们选择不同的排序方式,也会造成检索的数据页的范围不一样。


复合索引的工作模式——索引顺序的影响

我们通过不同的检索索引的顺序,对数据进行查询,因为检索跳转的路径不一样,从而造成查询效率不一样。

我们根据不同的索引执行策略,来进行索引的优化,从而提高查询效率。

相关文章