我对Mongo来说是全新的,并决定尝试使用我的日期集,我现在将其存储在MySQL中。我已经开始使用单个表,现在证明是文档集合。
每个文档都有大约30个属性,每个属性通常都是一个短字符串。所以在MySQL中我有varchar字段,在Mongo它只是BSON。
当我发现我在Mongo中获得的数据库大小几乎是mysql innodb的7倍时,我感到非常惊讶。凭借1,500,000条记录/文档,它在MySQL中约为350 Mb,在Monbo中约为2.3 Gb,因为它存储了每条数据的属性名称。
有没有办法提出'架构'并规范化数据以减少数据库大小?
UPD:
我使用MongoDB 3.4,因为db.serverstatus().storageEngine.name
是mmapv1
,我想我使用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 results:
{
"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
}
答案 0 :(得分:1)
有没有办法提出'架构'并减少数据库大小?
没有。 Mongodb是无模式的,这是它的核心功能之一。您可以为属性使用较短的名称。或者使用压缩存储引擎(WiredTiger)。
答案 1 :(得分:1)
有关如何减少数据库大小的一些提示:
首先,从MMApv1切换到WiredTiger存储引擎,因为压缩数据的效率更高。
默认压缩级别是 snappy ,但您可以使用 zlib 进行更多压缩,而性能折衷很少。有关详细信息,请参阅Mongodb 3.0
。
要迁移到WiredTiger,请参阅MongoDB文档中的本教程:https://docs.mongodb.com/manual/tutorial/change-standalone-wiredtiger/
第二件事是减少文档大小(根据avgObjSize
字段,当前大约为1008字节)。为此,请使用较小的键(理想情况下,使用两个字母的长键)。
例如,
companyDataFromSource1
==> c1
启用压缩后,这样做的好处很小,但这总是一个很好的做法,因为它会减少将通过网络发送到您的应用程序/的数据的大小