Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MongoDB第二期:压缩与索引

MongoDB第二期:压缩与索引

原创
作者头像
迪B哥
修改于 2017-08-16 06:46:00
修改于 2017-08-16 06:46:00
8.1K00
代码可运行
举报
文章被收录于专栏: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的WiredTiger存储引擎
WiredTiger提供文档级别(Document-Level)的并发控制,检查点(CheckPoint),数据压缩和本地数据加密( Native Encryption)等功能。从MongoDB 3.2 版本开始,WiredTiger成为MongDB默认的Storage Engine。
赵渝强老师
2024/09/02
2100
【赵渝强老师】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存储引擎发展及WiredTiger深入解析(二)
在早期,MongoDB主要使用的是MMAPv1存储引擎。基于内存映射文件的数据管理方式,MMAPv1在某些特定场景下表现出色。然而,随着数据量的增长和复杂应用场景的增多,MMAPv1在大量写入操作下的性能瓶颈逐渐显现。
公众号:码到三十五
2024/03/19
5750
MongoDB存储引擎发展及WiredTiger深入解析(二)
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.4K0
MongoDB系列7:MongoDB存储引擎
mongodb 内存引擎及配置
上次我们分享到了 wiredTiger 引擎以及他对于以前默认的 MMAPV1 引擎的优势
阿兵云原生
2023/02/16
1.1K0
常见问题: MongoDB 存储
存储引擎是数据库的一部分,负责管理如何在内存和磁盘上存储数据。许多数据库支持多个存储引擎,其中不同的引擎对特定工作负载的性能会更好。例如,一个存储引擎可能为读取繁重的工作负载提供更好的性能,另一个可能支持更高的写入操作吞吐量。
MongoDB中文社区
2019/06/11
2.7K0
常见问题: MongoDB 存储
思维导图学《Mongo 官方文档》
本文是对 Mongo 官方文档粗略的总结,并没有涉及到很深的细节(细节还是直接看官方文档吧)。我认为 Mongo 有重要的就 3 点:
Yano_nankai
2018/10/08
1.4K0
思维导图学《Mongo 官方文档》
mongoDB知识总结
MongoDB 是基于文档的 NoSql 存储引擎。MongoDB 的数据库管理由数据库、Collection(集合,类似MySql的表)、Document(文档,类似MySQL的行)组成,每个Document都是一个类JSON结构BSON结构数据。 MongoDB 的核心特性是:No Schema、高可用、分布式(可平行扩展),另外MongoDB自带数据压缩功能,使得同样的数据存储所需的资源更少。
leobhao
2024/04/01
4360
mongoDB知识总结
MongoDB 删除数据是否会释放存储空间
通过删除无用数据来释放存储空间,对于数据库来说是很常见的需求。但是很多 MongoDB用户发现,在执行删除操作后,存储空间并没有很快释放。
彭振翼
2023/05/28
4.8K1
MongoDB 删除数据是否会释放存储空间
MongoDB 初体验:存储引擎 MMAPv1 与高内存消耗及升级迁移
当我对公司的一个内部系统性能无可忍受时,意外发现在这个内存仅为 32G 的服务器上,运行着一个 MongoDB 数据库,其主进程 mongod 占用了 30.705 G的虚拟内存空间。这立刻引起了我的兴趣,必须要研究一下其工作原理。
数据和云
2018/07/27
1.7K0
MongoDB 初体验:存储引擎 MMAPv1 与高内存消耗及升级迁移
MongoDB使用小结:一些常用操作分享
本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell、pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程。
拓荒者
2019/09/06
2.1K0
MONGODB 磁盘与内存的数据格式是否一致
但后续的问题我模糊了,例如磁盘和内存的数据是否完全一致,压缩的比率是多少,等等。人无完人,我也不是DB 百科全书。不过好在还不是中年油腻大叔,模糊了那就learning 去。
AustinDatabases
2019/11/04
1.1K0
MONGODB  磁盘与内存的数据格式是否一致
云测评 | MongoDB两代引擎谁更强?
本文作者是来自Percona的支持工程师 Vinodh Krishnaswamy 和 Aayushi Mangal。主要介绍了MongoDB中两个引擎之间的差异,并在文章结尾处给出了表格对比总结。文章由腾讯云数据库团队翻译整理,全文约2050字,阅读需要5分钟。 ---- 在这篇文章中,我们将了解到MongoDB中MMAP和WiredTiger引擎之间的差异。很多客户都咨询过这两个引擎的问题,这篇文章将为你们解决难题。我们将告诉您这些引擎的主要特性,您可以根据自己的需求选择合适的引擎。 在MongoDB中
腾讯云数据库 TencentDB
2019/05/16
1.7K0
云测评 | MongoDB两代引擎谁更强?
云测评-MongoDB存储引擎谁更强
导读:本文作者是来自Percona的支持工程师 Vinodh Krishnaswamy 和 Aayushi Mangal。这篇文章主要介绍了MongoDB中两个引擎之间的差异,并在文章结尾处给出了表格对比总结。全文约2050字,阅读需要5分钟。
磊哥测评
2019/03/29
2.3K0
云测评-MongoDB存储引擎谁更强
MongoDB 存储引擎
上次我们说到了关于 mongodb 的集群,分为主从集群和分片集群,对于分片集群中的分片这里需要注意如下几点,一起来回顾一下:
阿兵云原生
2023/02/16
6220
MongoDB 基础浅谈
作者:hazenweng,腾讯 QQ 音乐后台开发工程师 MongoDB 作为一款优秀的基于分布式文件存储的 NoSQL 数据库,在业界有着广泛的应用。下文对 MongoDB 的一些基础概念进行简单介绍。 1 MongoDB 特点 面向集合存储:MongoDB 是面向集合的,数据以 collection 分组存储。每个 collection 在数据库中都有唯一的名称。 模式自由:集合的概念类似 MySQL 里的表,但它不需要定义任何模式。 结构松散:对于存储在数据库中的文档,不需要设置相同的字段,并且
腾讯技术工程官方号
2021/09/18
1.5K0
MongoDB数据存储-深入了解
最近运维中时常涉及到MongoDB的维护工作,今天详细梳理下MongoDB数据存储方面的内容。首先需要深入了解的一个概念:Memeory-Mapped Files 通过上图可以看出MongoDB数据库
洗尽了浮华
2018/01/23
5.5K0
MongoDB数据存储-深入了解
MongoDB3.2 存储策略
本文是MongoDB存储策略的一个简单翻译加讲解,存储引擎部分只介绍 wiredTiger,只有企业版支持的inMemory和落后于wiredTiger的mmapv1你可以参考官方文档。 官方给出存储策略如下:
李振
2021/11/26
7090
MongoDB3.2 存储策略
千亿数据扛不住,三思后还是从MySQL迁走了……
杨亚洲,前滴滴出行专家工程师,现任OPPO文档数据库MongoDB负责人,负责数万亿级数据量文档数据库MongoDB内核研发、性能优化及运维工作,一直专注于分布式缓存、高性能服务端、数据库、中间件等相关研发。后续持续分享《MongoDB内核源码设计、性能优化、最佳运维实践》。
jeanron100
2021/06/09
1.3K0
Mongodb Delete与TTL索引删除数据磁盘不释放
在使用MongoDB时,我们经常需要删除过期或不再需要的数据,以保证数据库的性能和存储效率。MongoDB提供了多种删除数据的方法,包括普通的删除操作(delete)和TTL(Time-To-Live)索引。虽然这两种方法都能从逻辑上删除数据,但它们在磁盘空间管理上的表现却并不相同。
DBA实战
2024/09/06
2400
Mongodb Delete与TTL索引删除数据磁盘不释放
相关推荐
【赵渝强老师】MongoDB的WiredTiger存储引擎
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验