MongoDB线上实践指南-基础篇之支撑百亿级访问(四)

来源:互联网 发布:施耐庵子孙 哑巴 知乎 编辑:程序博客网 时间:2024/06/08 12:59

MongoDB操作性能


1索引中的-1和1是不一样的,一个是逆序,一个是正序,应当根据自己的业务场景建立适合的索引排序,需要注意的是{a:1,b:-1} 和 {a:-1,b:1}是一样的

2在开发业务的时候尽量检查自己的程序性能,可以使用 explain() 函数检查你的查询执行详情,另外 hint() 函数相当于 MySQL 中的 force index()

3查询中的某些 ne,notexists,ninor,尽量在业务中不要使用

  • $exist:因为松散的文档结构导致查询必须遍历每一个文档
  • $ne:如果当取反的值为大多数,则会扫描整个索引
  • $not:可能会导致查询优化器不知道应当使用哪个索引,所以会经常退化为全表扫描
  • $nin:全表扫描
  • or使in

4如果你的结合体积/文档数固定,那么建议创建 capped(封顶)集合,这种集合的写入性能非常高并无需专门清理老旧数据,需要注意的是 capped 表不支持r emove() 和 update()

5在写入数据的时候,如果你需要实现类似 MySQL 中 INSERT INTO ON DUPLICATE KEY UPDATE 的功能,那么可以选择 upsert() 函数

6不要一次取出太多的数据进行排序,MongoDB 目前支持对32MB以内的结果集进行排序,如果需要排序,那么请尽量限制结果集中的数据量

7MongoDB 的聚合框架非常好用,能够通过简单的语法实现复杂的统计查询,并且性能也不错

8如果需要清理掉一个集合中的所有数据,那么 remove() 的性能是非常低下的,该场景下应当使用 drop()
remove() 是逐行操作,所以在删除大量数据的时候性能很差

9写入大量数据的时候可以选择使用 batchInsert,但目前 MongoDB 每一次能够接受的最大消息长度为48MB,如果超出48MB,将会被自动拆分为多个48MB的消息

10在使用数组字段做为查询条件的时候,将于覆盖索引无缘
这是因为数组是保存在索引中的,即便将数组字段从需要返回的字段中剔除,这样的索引仍然无法覆盖查询

11在查询中如果有范围条件,那么尽量和定值条件放在一起进行过滤,并在创建索引的时候将定值查询字段放在范围查询字段前

0 0
原创粉丝点击