zoukankan      html  css  js  c++  java
  • MongoDB优化之一:常见优化方法

     常用性能优化方案

    创建索引

    限定返回结果数

    只查询使用到的字段

    采用capped collection

    采用Server Side Code Execution

    使用Hint,强制使用索引

    Hint

     虽然MongoDB查询优化器一般工作的很不错,但是也可以使用hint()来强迫MongoDB使用一个特定的索引。在这种方法下某些情形下会提升性能。一个有索引的collection并且执行一个多字段的查询。传入一个制定的索引,强迫查询使用该索引

    db.users.find({"username":"user1000", "age":30}).hint({"username":1})

    注意:请确定你已经创建了相应的索引。

    假设在users上有个{"a": 1, "b": 1}的索引,名称是"a_1_b_1",则如下两种方式等价:

    db.users.find({"a": 4, "b": 5, "c": 6}).hint({"a": 1, "b": 1})
    db.users.find({"a": 4, "b": 5, "c": 6}).hint("a_1_b_1")

    也可以强迫查询不适用索引,做表扫描:

    db.users.find().hint({"$natural":1})

    采用Profiling

    其他优化

    1、MongoDB中低效率的操作符

    "$where"和"$exists":这两个操作符,完全不能使用索引。

    "$ne":通常来说取反的效率比较低。"$ne"查询可以使用索引,但并不是很有效。因为他必须查看所有的索引条目,而不是"$ne"指定的条目,这个时候他就不得不扫描整个索引。

    "$not":有时候能够使用索引,但是他通常并不知道要如何使用索引。所以大多数情况"$not"会退化为全表扫描。

    "$nin":这个操作符总是会全表扫描

    2、OR查询

             MongoDB在一次查询中只能使用一个索引(至少我现在用的2.6是这样的),如果你在{"x":1}上有一个索引,在{"y":1}上也有一个索引,在{"x":1,"y":1}上执行查询时,MongoDB只会使用其中一个索引,而不是两个一起使用。"$or"是一个例外,"$or"可以对每个字句都使用索引,因为"$or"实际上是执行两次查询然后将结果合并。

             通常来说,使用or查询多次在合并结果,不如单次查询的效率高,对于单个字段,应该尽可能使用$in。

    3、MongoDB的查询优化器

            MongoDB的查询优化器与其他数据库的稍微不同。基本来说,如果一个索引能够精确匹配一个查询,那么查询优化器就会使用这个索引,如果不能精确匹配,可能会有几个索引都适合你的查询。那MongoDB是怎样选择的呢?答:MongoDB的查询计划会将多个索引并行的去执行,最早返回100个结果的就是胜者,其他查询计划都会被终止。

          这个查询计划会被缓冲,接下来的这个查询都会使用他,下面几种情况会重新计划;

      1. 最初的计划评估之后集合发生了比较大的数据波动,查询优化器就会重新挑选可行的查询计划。
      2. 建立索引时。
      3. 每执行1000次查询之后,查询优化器就会重新评估查询计划

    4、何时不应该使用索引

            提取较小的子数据集时,索引非常有效(所以才有了分页)。也有一些查询不使用索引会更快。结果集在原集合中所占的比例越大,查询效率越慢。因为使用索引需要进行两次查找:一次查找索引条目,一次根据索引指针去查找相应的文档。而全表扫描只需要进行一次查询。在最坏的情况,使用索引进行查找次数会是全表扫描的两倍。效率会明显比全表扫描低。

            可惜并没有一个严格的规则可以告诉我们,如果根据索引大小、文档大小来判断什么时候索引很有用,一般来说,如果查询需要返回集合内30%的文档(或者更多),那就应该测试全表扫描和走索引查询那个速度比较快。这个数字也会在2%~60%之间进行波动。

    这个时候可以使用hint({"$natural":true})强制查询走全表扫描。

  • 相关阅读:
    Unity 3D Customizing Your Workspace 自定义工作区
    Unity3D 学习界面 Learning the Interface
    【Python】函数功能描述
    没有显示器的情况下安装和使用树莓派
    【Linux】03-Linux用户权限相关命令
    【Linux】02-Linux远程管理常用命令
    【Linux】01-Linux基本命令
    【12c】DataGuard构建物理备用数据库(Cloud Control方式)
    【12c】一文教你详细了解如何安装Oracle Enterprise Manager Cloud Control 12c
    【12c】新特性:一文带你详细了解Oracle 12c 数据库的自动数据优化(ADO)
  • 原文地址:https://www.cnblogs.com/duanxz/p/3611689.html
Copyright © 2011-2022 走看看