有点标题党的意思,不过下面三招确实比较实用,内容来自Conversocial公司的VP Colin Howe在London MongoDB用户组的一个分享。

下面几点并非放四海皆准的法则,具体是否能够使用,还需要根据自己的应用场景和数据特点来决定。

1.使用组合式的大文档

我们知道MongoDB是一个文档数据库,其每一条记录都是一个JSON格式的文档。比如像下面的例子,每一天会生成一条这样的统计数据:

{ metric: "content_count", client: 5, value: 51, date: ISODate("2012-04-01 13:00") } { metric: "content_count", client: 5, value: 49, date: ISODate("2012-04-02 13:00") }

而如果采用组合式大文档的话,就可以这样将一个月的数据全部存到一条记录里:

{ metric: "content_count", client: 5, month: "2012-04", 1: 51, 2: 49, … }

通过上面两种方式存储,预先一共存储大约7GB的数据(机器只有1.7GB的内存),测试读取一年信息,这二者的读性能差别很明显:

第一种: 1.6秒

第二种: 0.3秒

那么问题在哪里呢?

实际上原因是组合式的存储在读取数据的时候,可以读取更少的文档数量。而读取文档如果不能完全在内存中的话,其代价主要是被花在磁盘seek上,第一种存储方式在获取一年数据时,需要读取的文档数更多,所以磁盘seek的数量也越多。所以更慢。

实际上MongoDB的知名使用者foursquare就大量采用这种方式来提升读性能。

2.采用特殊的索引结构

我们知道,MongoDB和传统数据库一样,都是采用B树作为索引的数据结构。对于树形的索引来说,保存热数据使用到的索引在存储上越集中,索引浪费掉的内存也越小。所以我们对比下面两种索引结构:

db.metrics.ensureIndex({ metric: 1, client: 1, date: 1})

db.metrics.ensureIndex({ date: 1, metric: 1, client: 1 })

采用这两种不同的结构,在插入性能上的差别也很明显。

当采用第一种结构时,数据量在2千万以下时,能够基本保持10k/s 的插入速度,而当数据量再增大,其插入速度就会慢慢降低到2.5k/s,当数据量再增大时,其性能可能会更低。

而采用第二种结构时,插入速度能够基本稳定在10k/s.

其原因是第二种结构将date字段放在了索引的第一位,这样在构建索引时,新数据更新索引时,不是在中间去更新的,只是在索引的尾巴处进行修改。那些插入时间过早的索引在后续的插入操作中几乎不需要进行修改。而第一种情况下,由于date字段不在最前面,所以其索引更新经常是发生在树结构的中间,导致索引结构会经常进行大规模的变化。

3.预留空间

与第1点相同,这一点同样是考虑到传统机械硬盘的主要操作时间是花在磁盘seek操作上。

比如还是拿第1点中的例子来说,我们在插入数据的时候,预先将这一年的数据需要的空间都一次性插入。这能保证我们这一年12个月的数据是在一条记录中,是顺序存储在磁盘上的,那么在读取的时候,我们可能只需要一次对磁盘的顺序读操作就能够读到一年的数据,相比前面的12次读取来说,磁盘seek也只有一次。

db.metrics.insert([ { metric: 'content_count', client: 3, date: '2012-01', 0: 0, 1: 0, 2: 0, … } { ……, date: '2012-02', … })

{ ……, date: '2012-03', … })

{ ……, date: '2012-04', … })

{ ……, date: '2012-05', … })

{ ……, date: '2012-06', … })

{ ……, date: '2012-07', … })

{ ……, date: '2012-08', … })

{ ……, date: '2012-09', … })

{ ……, date: '2012-10', … })

{ ……, date: '2012-11', … })

{ ……, date: '2012-12', … })

])

结果:

如果不采用预留空间的方式,读取一年的记录需要62ms

如果采用预留空间的方式,读取一年的记录只需要6.6ms

关注中国IDC圈官方微信:idc-quan 我们将定期推送IDC产业最新资讯

查看心情排行你看到此篇文章的感受是:


  • 支持

  • 高兴

  • 震惊

  • 愤怒

  • 无聊

  • 无奈

  • 谎言

  • 枪稿

  • 不解

  • 标题党
2022-04-14 15:44:09
市场情报 2022分布式存储线上峰会成功举行,驱动中国数据要素市场发展
4月14日,“2022分布式存储线上峰会”成功举行。本次峰会由百易传媒(DOIT)与厦门大学信息学院联合主办,中国计算机学会信息存储专委会、中国计算机行业协会信息存储与安 <详情>
2019-03-28 10:15:00
市场情报 道熵发布高端多活磁盘阵列,挑战业务零中断
这个春天不太平。3月20日,阿里系10多个产品线出现长时间中断情况,包括淘宝、1688、飞猪等平台,面对打不开的购物车,网友们的吐槽瞬间将#淘宝崩了#的话题送上热搜前五。 <详情>
2018-09-13 09:35:00
安全监控 面对静默错误,超融合只能束手无策?
何谓“静默错误”?静默错误译自英文:Silent Data Corruption。磁盘在使用过程中,除了会发生硬件错误、固件BUG或者软件BUG、供电问题、介质损坏等可以正常补货和告警的常 <详情>
2018-07-12 13:33:26
交换存储 磁盘阵列数据恢复问题集
Raid 5是最常见的raid方式之一,它本身也具有一定的数据保护机制,如果其中的一块盘坏了,插上新磁盘后,将会自动通过其他磁盘上的校验码实现数据恢复。 <详情>
2015-06-30 15:20:28
交换存储 闪存价格已经追平磁盘?
几乎所有的全闪存厂商都曾说过自己的闪存价格已经能够与磁盘阵列平分秋色。尽管在单位成本上确实如此,但磁盘仍旧有着难以超越的价格优势。如此,这些价格比对还有多少意义 <详情>