首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MongoDB第二期:压缩与索引

MongoDB第二期:压缩与索引

原创
作者头像
迪B哥
修改于 2017-08-16 06:46:00
修改于 2017-08-16 06:46:00
8.2K00
代码可运行
举报
文章被收录于专栏:MySQL实战分享MySQL实战分享
运行总次数:0
代码可运行

一、写在前面的话

1、关注的问题

(1)大数据时代的冲击,导致各种业务的对数据的依赖不断加大,要求存储的数据格式更加复杂和趋于个性化,而要求保留的时间也越来越长,对数据库存储的压力随之不断提升。

(2)由于数据的重要性和价值不断提升,对历史数据的利用率也愈发提高,冷热数据的界定也逐渐模糊,对于全量数据的查询处理速度的要求也越来越高。

2、MongoDB怎样应对

(1)数据量大?格式复杂?

MongoDB自身的文档型NoSQL特性很好的解决了格式灵活设置,在同一个库中支持不同格式的求,而在MongoDB-3.2中WiredTiger存储引擎引入了压缩功能,出色的压缩了海量数据的存储空间。

(2)快速查询大量数据,开销如何?

建立索引将大量提高数据的查找和处理效率(本文着重关注索引的开销,关于索引的效率将在性能分析中呈现),但在海量数据中建立索引的开销过大(时间、空间)一直是一个棘手的问题。MongoDB很好的优化了建立索引的机制,对于海量数据,能够很好的缩短建立时间和压缩占用空间。

二、压缩

1、概念

(1)压缩原理

MongoDB-3.2使用 WiredTiger存储引擎,支持压缩一个新的存储引擎。 WiredTiger使用页面管理磁盘I / O。每个页面都包含很多BSON文件。页面被写入磁盘时就被默认压缩,当在磁盘中被读入高速缓存时它们就被解压。

WiredTiger支持对所有集合和索引进行Block压缩和前缀压缩(如果数据库启用了journal,journal文件一样会压缩)。这为广大MongoDB使用者们带来了又一福音,因为之前版本的MongoDB都是因为MMAP存储引擎消耗了过多的磁盘空间而不得已进行扩容。其中Snappy压缩为数据库的默认压缩方式,用户可以根据业务需求选择适合的压缩方式。理论上来说,Snappy压缩速度快,压缩率OK,而Zlib压缩率高,CPU消耗多且速度稍慢。当然,只要选择使用压缩,MongoDB肯定会占用更多的CPU使用率,但是考虑到MongoDB本身并不是十分耗CPU,所以启用压缩完全是值得的。

(2)集合压缩

①无压缩

②Snappy(默认启用)

③zlib

(3)索引压缩

①无压缩

②前缀(默认启用)

2、使用

(1)适用/不适用的场景

①随机数据不能压缩;

②已经压缩过的数据(可能是二进制数据)不能压缩;

③文本压缩效果特别好;

④对于文件中的字段名压缩效果特别好(尤其是短字段名)。

(2)如何开启

MongoDB中3.2的默认是WiredTiger存储引擎,故其默认对集合和索引启用压缩。在使用之前版本的MongoDB(3.0~3.2)时,你还需要指定–storageEngine选择使用WiredTiger再利用压缩功能。为了在启动时明确设置副本的压缩,可以在配置文件中的进行相应设置。使用命令行选项–wiredTigerCollectionBlockCompressor。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    要指定压缩特定的集合,你需要使用db.createCollection() 命令中的并传入相应参数项来覆盖默认值。例如,使用zlib压缩库创建一个名为email的集合:

db . createCollection ( “email” , { storageEngine : {wiredTiger : { configString : ‘block_compressor=zlib’ } } } )

3、实战

(1)场景介绍

数据结构

②集合大小

Colletion_1: 3000万

Colletion_2: 8500万

Colletion_3: 1亿

Colletion_4: 1.2亿

Colletion_5: 1.5亿

(2)测试结果

  • MongoDB的Wired Tiger存储引擎在数据压缩(主要是文本数据)的能力出色,基本上能达到压缩55%左右的存储空间,极大程度上提升了磁盘空间的使用率。
  • MongoDB的Wired Tiger存储引擎压缩从小规模数据的压缩到海量数据的压缩其性能保持稳定,压缩率均在54%~55%。可以说明数据量的增大不会成为其压缩功能的瓶颈。
  • 三、索引

1、概念

MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL关系型数据库一样。其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为奇。

2、使用

(1)创建索引

①普通索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.test.ensureIndex({"username":1},{"name":"testindex"},{"background":true})

注意:将username键的索引命名为"testindex",默认情况下建立的单个索引均为普通索引(非唯一索引),且在后台进行创建,不会阻塞其他操作。

②复合索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                 > db.test.ensureIndex({"username":1, "age":-1})

注意:数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储。

③唯一索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  > db.test.ensureIndex({"userid":1},{"unique":true})
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 > db.test.ensureIndex({"userid":1,"age":1},{"unique":true})

注意:单个索引和复合索引均可设置为唯一索引,只需保证插入数据的唯一性即可。

(2)查看索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.test.getIndexes()

(3)删除索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.test.dropIndex({"username":1})

3、实战

(1) 场景介绍

① 唯一索引

② 普通索引

③ 复合索引

(2)测试结果

①空间开销

  • 测试集合为Colletion_5(1.5亿数据,压缩后存储空间约为44GB),其中索引(唯一索引、普通索引、复合索引)所占空间约为2.5GB,占存储总空间的5.7%。
  • 在三种不同的索引中,

唯一索引(_ id) 占 58%,

复合索引(ialgVersion_ftime)占24%,

普通索引(sSysver)占18%。

说明建立唯一索引是主要是影响索引空间开销的主要因素,而复合索引所占空间小于其分别建立单个普通索引。

②时间开销

  • 随着数据量的增大,建立索引的时间开销将不断增大,故数据集合最初的设计极为重要,在海量数据生成后中建立索引,有一定的时间开销。
  • 在建立索引的时间开销上:普通索引 < 复合索引(2个)< 唯一索引。

在一亿数据的集合中,

普通索引(时间开销):约5分钟

复合索引(时间开销):约5.5分钟

唯一索引(时间开销):约7分钟

《 MongoDB 第一期 :集群搭建 》 《 MongoDB 第三期:托管 MongoDB 存储服务 》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB系列7:MongoDB存储引擎
1、前言 存储引擎是数据库的组成部分,负责管理数据存储。 MongoDB支持的以下存储引擎: 存储引擎描述WiredTiger存储引擎从MongoDB 3.2开始默认的存储引擎,新的版本MongoDB推荐使用WiredTiger存储引擎。MMAPv1存储引擎MMAPv1是MongoDB 3.2之前版本默认的存储引擎。In-Memory存储引擎MongoDB企业版支持In-Memory存储引擎。 表 2、WiredTiger存储引擎 从MongoDB 3.2开始,MongoDB默认的存储引擎为WiredTig
大数据和云计算技术
2018/03/30
2.5K0
MongoDB系列7:MongoDB存储引擎
【赵渝强老师】MongoDB的WiredTiger存储引擎
WiredTiger提供文档级别(Document-Level)的并发控制,检查点(CheckPoint),数据压缩和本地数据加密( Native Encryption)等功能。从MongoDB 3.2 版本开始,WiredTiger成为MongDB默认的Storage Engine。
赵渝强老师
2024/09/02
2590
【赵渝强老师】MongoDB的WiredTiger存储引擎
5个要点,带你了解MongoDB的WiredTiger存储引擎
MongoDB Manual (Version 4.2)> Storage > Storage Engines > WiredTiger Storage Engine
MongoDB中文社区
2020/04/24
2.1K0
5个要点,带你了解MongoDB的WiredTiger存储引擎
云测评-MongoDB存储引擎谁更强
导读:本文作者是来自Percona的支持工程师 Vinodh Krishnaswamy 和 Aayushi Mangal。这篇文章主要介绍了MongoDB中两个引擎之间的差异,并在文章结尾处给出了表格对比总结。全文约2050字,阅读需要5分钟。
磊哥测评
2019/03/29
2.4K0
云测评-MongoDB存储引擎谁更强
MongoDB存储引擎发展及WiredTiger深入解析(二)
在早期,MongoDB主要使用的是MMAPv1存储引擎。基于内存映射文件的数据管理方式,MMAPv1在某些特定场景下表现出色。然而,随着数据量的增长和复杂应用场景的增多,MMAPv1在大量写入操作下的性能瓶颈逐渐显现。
公众号:码到三十五
2024/03/19
6500
MongoDB存储引擎发展及WiredTiger深入解析(二)
MongoDB 删除数据是否会释放存储空间
通过删除无用数据来释放存储空间,对于数据库来说是很常见的需求。但是很多 MongoDB用户发现,在执行删除操作后,存储空间并没有很快释放。
彭振翼
2023/05/28
5K1
MongoDB 删除数据是否会释放存储空间
常见问题: MongoDB 存储
存储引擎是数据库的一部分,负责管理如何在内存和磁盘上存储数据。许多数据库支持多个存储引擎,其中不同的引擎对特定工作负载的性能会更好。例如,一个存储引擎可能为读取繁重的工作负载提供更好的性能,另一个可能支持更高的写入操作吞吐量。
MongoDB中文社区
2019/06/11
2.8K0
常见问题: MongoDB 存储
云测评 | MongoDB两代引擎谁更强?
本文作者是来自Percona的支持工程师 Vinodh Krishnaswamy 和 Aayushi Mangal。主要介绍了MongoDB中两个引擎之间的差异,并在文章结尾处给出了表格对比总结。文章由腾讯云数据库团队翻译整理,全文约2050字,阅读需要5分钟。 ---- 在这篇文章中,我们将了解到MongoDB中MMAP和WiredTiger引擎之间的差异。很多客户都咨询过这两个引擎的问题,这篇文章将为你们解决难题。我们将告诉您这些引擎的主要特性,您可以根据自己的需求选择合适的引擎。 在MongoDB中
腾讯云数据库 TencentDB
2019/05/16
1.7K0
云测评 | MongoDB两代引擎谁更强?
思维导图学《Mongo 官方文档》
本文是对 Mongo 官方文档粗略的总结,并没有涉及到很深的细节(细节还是直接看官方文档吧)。我认为 Mongo 有重要的就 3 点:
Yano_nankai
2018/10/08
1.4K0
思维导图学《Mongo 官方文档》
MONGODB 磁盘与内存的数据格式是否一致
但后续的问题我模糊了,例如磁盘和内存的数据是否完全一致,压缩的比率是多少,等等。人无完人,我也不是DB 百科全书。不过好在还不是中年油腻大叔,模糊了那就learning 去。
AustinDatabases
2019/11/04
1.1K0
MONGODB  磁盘与内存的数据格式是否一致
mongodb 内存引擎及配置
上次我们分享到了 wiredTiger 引擎以及他对于以前默认的 MMAPV1 引擎的优势
阿兵云原生
2023/02/16
1.2K0
MongoDB3.2 存储策略
本文是MongoDB存储策略的一个简单翻译加讲解,存储引擎部分只介绍 wiredTiger,只有企业版支持的inMemory和落后于wiredTiger的mmapv1你可以参考官方文档。 官方给出存储策略如下:
李振
2021/11/26
7470
MongoDB3.2 存储策略
MongoDB 基础浅谈
作者:hazenweng,腾讯 QQ 音乐后台开发工程师 MongoDB 作为一款优秀的基于分布式文件存储的 NoSQL 数据库,在业界有着广泛的应用。下文对 MongoDB 的一些基础概念进行简单介绍。 1 MongoDB 特点 面向集合存储:MongoDB 是面向集合的,数据以 collection 分组存储。每个 collection 在数据库中都有唯一的名称。 模式自由:集合的概念类似 MySQL 里的表,但它不需要定义任何模式。 结构松散:对于存储在数据库中的文档,不需要设置相同的字段,并且
腾讯技术工程官方号
2021/09/18
1.6K0
腾讯云MongoDB内核贡献全球领先
MongoDB是一款深受欢迎的文档数据库。它适合处理复杂、松散的半结构化数据,比如游戏数据、社交媒体内容、日志文件、地理位置等,被广泛运用于游戏、出行、电商等场景。
小腾资讯君
2024/10/12
3280
性能最佳实践:MongoDB索引
在本系列中,我们将讨论在大规模数据下实现高性能,需要在许多重要维度上进行考虑的关键因素,其中包括:
MongoDB中文社区
2020/10/10
3.8K0
性能最佳实践:MongoDB索引
MongoDB基础知识及原理概述
MongoDB将等到它达到你请求的级别或者超时时间.如果它超时,它可能仍然完成了其中的一部分.如果发生超时,你可能需要确认状态
鳄鱼儿
2024/05/21
2580
MongoDB基础知识及原理概述
MongoDB系列四(索引).
一、索引简介     再来老生常谈一番,什么是索引呢?数据库索引与书籍的索引类似。有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目以后,就可以直接跳转到目标文档的位置,这能使查找速度提高几个数量级。     然而,使用索引是有代价的:对于添加的每一个索引,每次写操作(插入、更新、删除)都将耗费更多的时间。这是因为,当数据发生变动时,MongoDB不仅要更新文档,还要更新集合上的所有索引。因此,MongoDB限制每个集合上最多只能有64个索引。通常,在一个特定的集合上,不应该拥有两个以上
JMCui
2018/04/17
2.5K0
MongoDB系列四(索引).
数据库压缩技术简介
最近接触到一些海量数据存储的需求,为了解决这样的需求,一个想法是对数据进行一定程度的聚合。在应用层的聚合方式,这里不展开。但是让我联想到的是以前学习 prometheus tsdb的时候接触到的压缩技术。即使本质上来讲,应用层的数据聚合,就是一种数据压缩技术。而 tsdb 使用的 gorilla 技术令人印象深刻。有兴趣的可以详细看一下 prometheus 作者的这篇博客, 以及其使用的技术 gorilla 的 paper. 简而言之 prometheus 的 tsdb 简洁强大,受益于其高效的压缩【gorilla 平均能压缩 16 byte samples to an average of 1.37 bytes】和查询效率,其单机的设计并没有影响他在众多场景中的广泛使用。
王磊-字节跳动
2021/01/17
3.8K0
MongoDB 索引
当往一个集合中插入多个文档后,每个文档经过存储殷引擎后,有一个位置信息,通过这个位置信息。就能从存储引擎中读出该文档。在 mmapv1 引擎下,位置信息是【文件id+文件内 offset】 。在wiredtiger存储引擎里,位置信息是 wiredgiter 在存储文档时生成的一个 key ,通过这个key 能访问到对应的文档。
王小明_HIT
2019/08/13
7810
mongoDB知识总结
MongoDB 是基于文档的 NoSql 存储引擎。MongoDB 的数据库管理由数据库、Collection(集合,类似MySql的表)、Document(文档,类似MySQL的行)组成,每个Document都是一个类JSON结构BSON结构数据。 MongoDB 的核心特性是:No Schema、高可用、分布式(可平行扩展),另外MongoDB自带数据压缩功能,使得同样的数据存储所需的资源更少。
leobhao
2024/04/01
5260
mongoDB知识总结
相关推荐
MongoDB系列7:MongoDB存储引擎
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档