mongodb的一些tips

1
 数据冗余是为了性能,引用数据是为了完整性。
决定使用嵌入式结构还是使用引用式结构,可以参考下面的因素:
为很少发生变化的数据,每次都是再次读取,你是否愿意付出这样的代价?
一致性有多重要?
是否需要更快的读取速度?"
2
 如果你想你的数据为不会过时的技术服务的话,请使用引用式结构
3  
 尽量使用一次查询获取所需的数据
4  
 嵌入依赖的字段。例如连接表作为嵌入字段。
 对某一时间点的数据采用嵌入式结构。
 不要嵌入无限增长的字段.例如评论。
 预先填充你能填充的。例如预先填充0到未来几个小时。
 只要可能,可以预先分配一些空间.
9
 将通用化的信息使用嵌入式结构存储在数组中。例如{ 
  ""_id"":""fred"", 
  ""items"":[
    { ""id"":""slingshot"", 
      ""type"":""weapon"", 
      ""damage"":23, 
      ""ranged"":true 
    }, 
    { ""id"":""jar"",
      ""type"":""container"", 
      ""contains"":""fairy"" 
    }, 
    { ""id"":""sword"",
      ""type"":""weapon"", 
      ""damage"":30, 
      ""ranged"":false 
    } 
  ] 
} 可以使用查询{""items.damage"":{""$gt"":20}} "
10 
 将文档设计成自给自足的。
例如计算平均数或者是计算加和这样琐碎的工作,
都应该推给客户端去做。
>var resule=db.runCommand({""findAndModify"":""food"", 
  ""query"":{""_id"":123,""locked"":false}, 
  ""update"":{""$set"":{""locked"":true}}}) 
>if (""banana"" in result.value){ 
  db.food.update({criteria,{""$set"":{""locked"":false}.""$inc"":{""banana"":20}}}) 
  }else{ 
  db.food.update({criteria,{""$set"":{""locked"":false},""$inc"":{""banana"":3,""total"":1}}}) 
} "
11 
 使用$操作符,而不是用javascript($where).
MongoDB提供了一组比较操作符:$lt/$lte/$gt/$gte/$ne,依次等价于</<=/>/>=/!="
12
 使用的过程中,随时计算聚合量.inc优先于批处理过程。批处理处理复杂的计算。
13
 用代码来解决数据完整性的问题
14  
 使用正确的数据类型。如果是排序比较的话,32bit整型、64bit整型或者double类型都没有问题。
但是,有些特定类型的特定操作就不一样了,位操作符AND和OR只能应用在整型数据上。
出生日期用形如yyyy-mm-dd的字符串。所有的字符串必须是utf-8编码的。ObjectId不是字符串,和时间相关。

15 
 当你的数据有简单的,唯一的主键的时候,可以覆写内部的_id。但是数据必须不是随机的。
16
 避免使用文档作为_id列的值。例如_id,_id.foo,_id.bar,需要多个索引。
17
 不建议使用数据库引用。数据库引用是一种引用式的子文档,格式如下:
{$id:identifier,$ref:collectionName} 
还有一个可选的$db字段,用来指明数据库名称。如果想要引用它们,你必须进行第二次查询。评论则需要引用。             "
18
 "不要使用GridFS存储小的二进制数据。何在客户端可以一次性加载,
例如图片、声音,或者是小视频,都应该嵌入到主文档中就可以了"
19 
 处理无缝的故障恢复
20 
 "处理复制集的故障和故障恢复。不管是否存在master,你都应该继续提供读取的服务。
在primary选举阶段,服务器成员会经历简短的不可读,恢复阶段。在这个时期,如果驱动来读取数据,成员会抛出异常,找不到master和slave。"
21 
 将访问磁盘的次数降到最低。应该设计成在内存中保持特定的数据,很少直接访问磁盘。
22 
 Use indexes to do more with less memory。页面查找时候用index来保存查找记录,节省时间。
23 
 Don’t always use an index。返回超过一半记录不用index。db.foo.find().sort({"$natural" : 1})会让索引失效。
24 
 Create indexes that cover your queries。如果字段少,使用index可以只访问索引的字段而不是所有字段。
25 
 "Use compound indexes to make multiple queries fast。
collection.find({""x"" : criteria, ""y"" : criteria, ""z"" : criteria})
collection.find({""z"" : criteria, ""y"" : criteria, ""w"" : criteria})
collection.find({""y"" : criteria, ""w"" : criteria}) 查询一样多则使用组合索引
collection.ensureIndex({""y"" : 1, ""w"" : 1, ""z"" : 1})支持三个查询。
"
26 
 Create hierarchical documents for faster scans。db.users.find({""address.zip"" : ""10003""})查找更快

27 
 AND-queries should match as little as possible as fast
as possible。 AND操作符应该先返回小集合"
28 
 OR-queries should match as much as possible as soon
as possible。 OR操作符应该先返回大集合"
29 
 Write to the journal for single server, replicas
for multiserver"
30 
 Always use replication, journaling, or both
31 
 Do not depend on repair to recover data。使用备份更好。
32 
 Understand getlasterror。用于安全写。
33 
 Always use safe writes in development。开发会出错。
34 
 Use w with replication
35
 Always use wtimeout with w。不然他会阻塞等待。Wtimeout 100为100毫秒
36
 Don’t use fsync on every write。否则100毫秒才能写一次。
37
 Start up normally after a crash。正常启动会自动修复。
38
 Take instant-in-time backups of durable servers。需要fsync和lock
39
 Manually clean up your chunks collections
40
 Compact databases with repair。更新,删除操作会有空洞,repair需要> rs.stepDown()
> db.runCommand({fsync : 1, lock : 1})
mongodump --host ny1

41
 Don’t change the number of votes for members of a replica set
42
 Replica sets can be reconfigured without a master up。会自动选master
43
 “--shardsvr and --configsvr aren’t required.”它们有默认端口号
44
 Only use --notablescan in development 用于开发中确定有索引
45 
 Learn some JavaScript。作为一个数据库,MongoDB有一个很大的优势——它使用js管理数据库。例如mongo test.js
46 
 Manage all of your servers and databases from one
shell。可以用shell远程管理多个数据库。"
47 
 Get “help” for any function
48 
 Create startup files
49  
 把一些工具之类的功能做成函数。Add your own functions。var f = function() { ... }
rsA.getOplogSize = f;
rsB.getOplogSize = f;
rsC.getOplogSize = f;
You could also just alter it slightly to be a global function:
getOplogLength = function(db) {
var local = db.getSisterDB(""local"");
...
};
50 
 Use a single connection to read your own writes。两个连接的写入不能保证顺序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值