正确创建、使用索引

何时不应该使用索引

  1. 集合可以预知是比较小的,不必要创建索引,因为全表扫描的非常快,不必要维护索引;
  2. 可预知每次查询的结果集合占比比较大时(30%以上,占比越大索引速度越慢),就没有必要创建索引,因为使用索引需要进行2次查找(查找条目和根据索引指针去查找相应的文档)

正确创建索引

  1. 正确选择的文档字段创建索引,应该选择字段值基数大的创建索引;例如"性别"字段值基数只有“男”和“女”,那么创建索引的意义不大;
  2. 复合索引字段的顺序非常重要,应该将基数大的字段放在前面,这样查询时可以更精确定位目标结果集;
  3. 注意复合索引的排序方向选择,在基于多条件查询结果集进行排序时,索引方向对效率影响非常大;例如db.user.ensureIndex({age:1, "name":1})创建索引,当db.user.find({"age":{"$gte":21,"$lte":30}}).sort({"name":1})查询时需要对结果集在内存排序进行排序再返回;
  4. 对嵌套文档建立索引时,注意对嵌套文档本身和对嵌套文档的某个字段建立索引是不同的。
  5. 创建索引时,数组字段最多只能有一个,因为对数组建立索引实际上是对数组中的每一个元素建立索引,代价非常高;
  6. 对于某个索引的键,如果这个键在在某个文档中是一个数组,那这个索引就被标志位多键索引,即使把这个字段为数组的文档删掉了也不能变回非多键索引了;
  7. 正确建立隐式索引是避免在一个集合创建过多索引的好方法,例如有一个{"a":1,"b":1,"c":1,"d":1}索引,实际上可以使用包含字段a为前缀的索引如{"a":1,"c":1}{"a":1,"b":1,"c":1,}等;

正确使用索引

  1. 结果集需要排序时,必须注意索引的方向,避免结果集在内存中排序后在返回。当然这点在全表扫描和内存排序中衡量,如果查询结果集很小,内存排序效率还是非常快的;
  2. 注意使用覆盖索引提高查询效率,这样可以只查询条目不必要再根据索引指针去查找相应的文档了;
  3. “$ where"和检查一个键是否存在的{“key”:{”$ exist":false}}是不能使用索引的,因为在索引中不存在的字段和null字段的存储方式是一样的。
  4. “$ ne”取反查询使用索引不是很有效,因为经常几乎得检测所有索引条目,另外注意"$ nin"就总是进行全表扫描的;
  5. 在有复合索引时,多字段查询时应该将会用于精确匹配的字段放在前面(例如{"x":"foo"}),将用于范围匹配的字段放在后面;
  6. 应该尽量使用"$ in"查询代替用"$ or",因为"$ or"可以对每个字句都是用索引,相当于执行2次查询然后将结果集合并。
  7. 对于嵌套文档,如果是对嵌套文档本身建立的索引,那么只有在进行与子文档字段顺序完全匹配的子文档查询时,查询优化器才会使用嵌套文档本身建立的索引。
  8. 可以使用hint()强制查询使用特定的索引,但是如果指定有误反而会很影响查询效率,慎重使用吧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值