分享
MGO 设计调优。
jianyingLi · · 5516 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
MGO 设计调优。
真的是那句话,不是你不行,知识你不了解。而已。
- 肯定是不能加两个索引了。
- 索引的代价实在是太大了,不但占用内存还还大量损失查询性能,真心不能忍耐啊。
- 设计的时候DBRef肯定是需要的,直接用有意义的ID查询肯定是性能最好的。
- 控制key的数量肯定是必须的。比如说用户数量就是key的数量这就够了。别整那么多。collection不然损失性能。
- 如果真的想控制数量的话,那么数据关联肯定是十分必须的。
流量控制肯定也是必须的。
- 流量的来源在于Find直接返回所有查询结果。卧槽。直接吃掉所有流量。
- 直接用FindOne 避免查询多个结果回来肯定是必须的
FindOne就够了吗?我确实遇到这个坑了。在博文中已经提到关于这种情况适用filter的方法了。直接参考就OK了。
1
FindOne({_id:xxx},{Items:{"$slice":[3,1]}})
虽然适用了这种方法来设计,使得查询结果减少流量降低了。但是依然存在问题
- 一定更要注意,不能直接dbref因为slice不好加啊。可以用过顺序id加分页,或者算时间。233 很实用,典型的用空间换时间。
1
2
3
4
5
6
7db.user.findOne({user_id:2}, {"book.price":1,"book.price.":{$slice:[-10,4]}})
解释下其含义哈:
1. user集合
2. user.book.price 表示用户拥有书籍, 书籍呢有很多价格列表
3. 注意红色字体 "book.price." 末尾必须有个点
4. 查找价格列表里的4条数据, 从右边第10个位置开始便宜但是也有不同的语法说明,到时候试试吧。
update 要做精细修改。
1
比如Update({_id:xxx},{$set:{"Items.3.Item.Health":38}});//修改第三把武器的健康值
至于一次修改和批量修改,MongoDB默认100ms flush一次(2.x),只要两次修改比较贴近,被一起保存的可能性很高。
上面这些是引用别人说的话,还是全要直接精细修改,然后数据库会自动一起修改的,性能不成问题
- 最后几点注意
- 控制io(系统吞吐)这事整个系统的核心,也是系统性能的核心。
- 控制内存(不要让index膨胀)
- 控制index个数,
- 控制key的个数
- CPU控制不要让js做大量的计算,能迁移到客户端的计算就迁移到客户端,让他们算完之后在通讯
- 第一个性能不够的估计是硬盘,可以通过RAID或者企业级SSD搞定整个问题。
Golang MGO驱动使用
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信5516 次点击
上一篇:liteIDE 快捷键改装
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
MGO 设计调优。
真的是那句话,不是你不行,知识你不了解。而已。
- 肯定是不能加两个索引了。
- 索引的代价实在是太大了,不但占用内存还还大量损失查询性能,真心不能忍耐啊。
- 设计的时候DBRef肯定是需要的,直接用有意义的ID查询肯定是性能最好的。
- 控制key的数量肯定是必须的。比如说用户数量就是key的数量这就够了。别整那么多。collection不然损失性能。
- 如果真的想控制数量的话,那么数据关联肯定是十分必须的。
流量控制肯定也是必须的。
- 流量的来源在于Find直接返回所有查询结果。卧槽。直接吃掉所有流量。
- 直接用FindOne 避免查询多个结果回来肯定是必须的
FindOne就够了吗?我确实遇到这个坑了。在博文中已经提到关于这种情况适用filter的方法了。直接参考就OK了。
1
FindOne({_id:xxx},{Items:{"$slice":[3,1]}})
虽然适用了这种方法来设计,使得查询结果减少流量降低了。但是依然存在问题
- 一定更要注意,不能直接dbref因为slice不好加啊。可以用过顺序id加分页,或者算时间。233 很实用,典型的用空间换时间。
1
2
3
4
5
6
7db.user.findOne({user_id:2}, {"book.price":1,"book.price.":{$slice:[-10,4]}})
解释下其含义哈:
1. user集合
2. user.book.price 表示用户拥有书籍, 书籍呢有很多价格列表
3. 注意红色字体 "book.price." 末尾必须有个点
4. 查找价格列表里的4条数据, 从右边第10个位置开始便宜但是也有不同的语法说明,到时候试试吧。
update 要做精细修改。
1
比如Update({_id:xxx},{$set:{"Items.3.Item.Health":38}});//修改第三把武器的健康值
至于一次修改和批量修改,MongoDB默认100ms flush一次(2.x),只要两次修改比较贴近,被一起保存的可能性很高。
上面这些是引用别人说的话,还是全要直接精细修改,然后数据库会自动一起修改的,性能不成问题
- 最后几点注意
- 控制io(系统吞吐)这事整个系统的核心,也是系统性能的核心。
- 控制内存(不要让index膨胀)
- 控制index个数,
- 控制key的个数
- CPU控制不要让js做大量的计算,能迁移到客户端的计算就迁移到客户端,让他们算完之后在通讯
- 第一个性能不够的估计是硬盘,可以通过RAID或者企业级SSD搞定整个问题。