【问题标题】:Can I reduce mongo database size by normalizing and storing only values in each document?我可以通过规范化和仅存储每个文档中的值来减少 mongo 数据库大小吗?
【发布时间】:2017-12-08 16:48:05
【问题描述】:

我对 Mongo 完全陌生,因此决定尝试使用我现在存储在 MySQL 中的日期集。我从一个表开始,现在结果是文档集合。

每个文档大约有 30 个属性,每个属性通常是一个短字符串。所以在 MySQL 中我有 varchar 字段,而在 Mongo 中它只是 BSON。

当我发现我在 Mongo 中获得的数据库大小几乎是 mysql innodb 的 7 倍时,我真的很惊讶。对于 1,500,000 条记录/文档,它在 MySQL 中约为 350 Mb,在 Monbo 中约为 2.3 Gb,因为它存储了每条数据的属性名称。

有没有办法提出“模式”并规范化数据以减小数据库大小?

更新: 我使用 MongoDB 3.4,由于 db.serverstatus().storageEngine.namemmapv1,我想我使用 MMap。

示例文档:

{
  "_id" : ObjectId("595c4f4342ce99299c19c379"),
  "someNumber" : "11420",
  "companyDataFromSource1" : {
    "lolNumber" : "11420",
    "businessName" : "Feather mighty shop Inc",
    "businessOwner" : "",
    "businessHealthCode" : "Q",
    "realUpdateDate" : "13-OCt-16",
    "someNumericInfo" : "10000",
    "yearWhenItHappened" : "2014",
    "moreDate" : "22-Jan-02",
    "anotherStatus" : "DE",
    "numValue1" : "1",
    "numValue2" : "1",
    "someProp" : "E",
    "anotherProp" : "R",
    "street" : "BB251 Database St",
    "city" : "Denver",
    "state" : "CO",
    "zip" : "12345",
    "country" : "US",
    "anotherStreet" : "TT251 Server St",
    "anotherCity" : "Sratford",
    "anotherState" : "WI",
    "anotherZip" : "54484",
    "anotherCountry" : "US",
    "telephone" : "(123) 481-2222",
    "fax" : "",
    "emailAddress" : "qwwqwwqeewe@hotmail.com",
  }
}

db.collecion('collection').stats 结果:

{
  "ns" : "db.collection",
  "size" : 1507059792.0,
  "count" : 1495099,
  "avgObjSize" : 1008,
  "numExtents" : 19,
  "storageSize" : 1580150784.0,
  "lastExtentSize" : 415174656.0,
  "paddingFactor" : 1.0,
  "paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
  "userFlags" : 1,
  "capped" : false,
  "nindexes" : 1,
  "totalIndexSize" : 60518752,
  "indexSizes" : {
      "_id_" : 60518752
  },
"ok" : 1.0
}

【问题讨论】:

  • 你的 mongodb 版本是什么?您使用的是哪个引擎(WiredTiger、MMap、...?)压缩级别是多少?您能否提供您收藏的示例文档以及db.collection.stats() 命令的输出?
  • @fellix 我已经更新了问题

标签: mongodb


【解决方案1】:

关于如何减少数据库大小的一些提示:

数据库引擎

首先,从 MMApv1 切换到 WiredTiger 存储引擎,因为它压缩数据的效率更高。 默认压缩级别是 snappy,但您可以使用 zlib 进行更多压缩,而几乎不会牺牲性能。有关详细信息,请参阅Mongodb 3.0

要迁移到 WiredTiger,请参阅 MongoDB 文档中的本教程:https://docs.mongodb.com/manual/tutorial/change-standalone-wiredtiger/

减小密钥大小

第二件事是减小文档大小(根据 avgObjSize 字段,目前约为 1008 字节)。为此,请使用较小的键(最好是两个字母长的键)。 例如,

companyDataFromSource1 ==> c1

启用压缩后,这样做的好处会很小,但这始终是一个好习惯,因为它减少了将通过网络发送到您的应用程序的数据大小

【讨论】:

  • 非常感谢!切换到 WiredTiger 将数据库文件的大小减少到 417 Mb,这至少与 MySQL 数据库大小相当。
【解决方案2】:

有没有办法提出“模式”并减少数据库大小?

没有。 Mongodb 是无模式的,这是它的核心特性之一。您可以为您的属性使用较短的名称。或者使用压缩存储引擎(WiredTiger)。

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 2015-09-29
    • 1970-01-01
    • 2018-01-27
    • 2013-04-22
    • 2011-01-08
    • 1970-01-01
    • 2011-08-06
    • 2015-05-09
    相关资源
    最近更新 更多