我很好奇Kyle Banker's MongoDB的这句话:

考虑关键名称的长度是很重要的,因为关键名字存储在文档本身中.这与RDBMS形成了对比,RDBMS总是将列名与其所指的行分开.因此,当使用BSON时,如果您可以使用dob代替date_of_birth作为密钥名,那么每个文档将节省10个字节.这听起来可能不算多,但一旦你有了10亿个这样的文档,只需使用一个较短的密钥名,你就可以节省近10GB的存储空间.这并不意味着你应该采取不合理的措施来确保小的键名;理智一点.但是,如果您希望获得大量数据,那么节省关键名称将节省空间.

我对数据库服务器端没有优化的原因很感兴趣.一个包含集合中所有键名的内存中查找表是否会对性能造成太大的损失,而不值得节省空间?

推荐答案

您所指的通常被称为"密钥压缩"*.它没有得到实施有几个原因:

  1. 如果您想完成,目前可以在应用程序/ORM/ODM级别轻松完成.
  2. 在所有情况下,这不一定都是性能**的优势——想想有很多键名的集合,和/或文档之间差异很大的键名.
  3. 在拥有数百万个文档之前,它可能根本无法提供可测量的性能优势.
  4. 如果服务器这样做了,则必须通过网络传输完整的密钥名.
  5. 如果通过网络传输压缩的密钥名,则使用javascript控制台会影响可读性really.
  6. 压缩整个JSON文档可以提供更好的性能优势.

和所有功能一样,实现它也有成本效益分析,而且(至少到目前为止)其他功能提供了更多的"划算".

对于future 的MongoDB版本,完整文档压缩正在考虑中 从3.0版开始提供(见下文)

*内存中的键名查找表基本上是LZW风格压缩的一种特殊情况——这或多或少是大多数压缩算法所做的.

**压缩提供了空间优势和性能优势.较小的文档意味着每个IO可以读取更多的文档,这意味着在具有固定IO的系统中,每秒可以读取更多的文档.

使现代化

MongoDB 3.0及更高版本现在拥有WiredTiger存储引擎的完整文档压缩功能.

有两种压缩算法:snappyzlib.其目的是让snappy成为全面性能的最佳 Select ,让zlib成为最大存储容量的最佳 Select .

在我个人(非科学,但与商业项目有关)的实验中,snappy compression(我们没有判断zlib)提供了显著提高的存储密度,但没有明显的净性能成本.事实上,在某些情况下表现稍好一些,与我之前的 comments /预测大致一致.

Mongodb相关问答推荐

如何从MongoDB集合中获取第一个和最后一个元素?

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

减法聚合Mongo文档Golang

避免在 MongoDB 聚合框架中使用 ISODate() 以便管道可以是纯 JSON

MongoDB:从开始日期和结束日期数组中匹配特定日期的聚合查询

Mongo:查找具有 0 个关联文档的文档,成本更低

在mongodb中,如何使用聚合来获取字段之间的对应关系

使用 $addFields 将字段添加到 $lookup 结果中的每个项目

有没有办法在 Prisma for MongoDB 的模式中显式声明 int32?

使用 homebrew 和 Xcode 8.1.1 安装 Mongodb 失败

Stripe:必须提供来源或客户

什么 Javascript 库可以针对对象判断类似 MongoDB 的查询谓词?

无法从 javascript 打印 BSON 对象

如何使用 MongoDB Compass 对数据进行排序

在 MongoDB 上分片 GridFS

有人在 Google App Engine 上try 过 MongoDB 吗?

MongoDB备份计划

从 nodejs 到 mongodb 或 mongoose 的动态数据库连接

MongoDb 连接被拒绝

创建模型时出现mongoose错误