前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Mongodb多键索引之数组

Mongodb多键索引之数组

作者头像
徐靖
发布于 2020-08-18 06:19:28
发布于 2020-08-18 06:19:28
1.8K00
代码可运行
举报
文章被收录于专栏:DB说DB说
运行总次数:0
代码可运行

【背景】

最近有项目需求用到多键索引,Mongodb中字段值支持多键索引主要包括嵌套文档、数组以及数组嵌套文档.例如联系包括手机、固定电话、邮箱、微信、QQ等,对于字段值存储类型不一样,决定创建多键索引也不一样同时性能也存在差异,例如数组值(包括数组以及数组文档),创建多键索引时会为数组中每个元素都创建索引键,如数组中元素特别多,相应索引也会特别大,创建多键索引或者组合索引时最多只支持一个数组值.

嵌套文档:“telephone”:{"cellphone":"0211234567","mobilephone":13888888888}

数组:“telephone”:["0211234567",13888888888]

数组文档:“联系”:[“telephone”:{"cellphone":"0211234567","mobilephone":13888888888}]

【数组值创建并高效使用索引】

1、集合中文档信息

备注:ratings字段值是数组.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xiaoxu:PRIMARY> db.survey.findOne({});
{
  "_id" : ObjectId("5f2ff576eb7de181ebe814f9"),
  "item" : {
    "name" : "Katie",
    "manufactured" : 16
  },
  "ratings" : [
    16,
    116
  ],
  "user_id" : 16,
  "boolean" : true,
  "added_at" : ISODate("2020-08-09T13:09:10.791Z"),
  "number" : 662
}
xiaoxu:PRIMARY>

2、创建多键索引 db.survey.createIndex({"ratings":1},{background:1});

备注:创建多键索引不需要显示关键字,如字段值中包括数组值或者嵌套文档情况,这个存储引擎自动创建为多键盘索引,如4.2版本之前不加background:1,则前台创建索引,加DB级别排他锁(大表后果很严重),4.2开始加不加background:1都是online创建索引.

3、范围查找ratings

逻辑:

1、查询ratings数组中存在至少1个元素同时满足大于等于3且小于等于6【类似and逻辑 ,此时多键索引边界可以合并为【【3,6】】】--

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:{ $elemMatch: { $gte: 3, $lte: 6}}} )

2、查询ratings数组中存在至少1个元素大于等于3且至少1元素小于等于6或者存在一个元素同时满足大于等于3且小于等于6【类似or逻辑,【【3,+∞】】or【【-∞,6】】,此时执行计划只有使用or的一边,使用大于等于3然后过来另外一个值是否满足小于等于6或者反过来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:{ $gte: 3, $lte: 6} )  

【具体执行计划】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:{ $elemMatch: { $gte: 3, $lte: 6}}} )
xiaoxu:PRIMARY> db.survey.find( { ratings : { $elemMatch: { $gte: 3, $lte: 6 } } } ).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 4,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 4,
  "totalDocsExamined" : 4,
  "executionStages" : {
    "stage" : "FETCH",
    "filter" : {
      "ratings" : {
        "$elemMatch" : {
          "$lte" : 6,
          "$gte" : 3
        }
      }
    },
    "nReturned" : 4,
    "executionTimeMillisEstimate" : 0,
    "works" : 5,
    "advanced" : 4,
    "needTime" : 0,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 4,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 4,
      "executionTimeMillisEstimate" : 0,
      "works" : 5,
      "advanced" : 4,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings" : 1
      },
      "indexName" : "ratings_1",
      "isMultiKey" : true,
      "multiKeyPaths" : {
        "ratings" : [
          "ratings"
        ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings" : [
          "[3.0, 6.0]"
        ]
      },
      "keysExamined" : 4,
      "seeks" : 1,
      "dupsTested" : 4,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}

db.survey.find({ ratings:{ $gte: 3, $lte: 6} )  
xiaoxu:PRIMARY> db.survey.find( { ratings :  { $gte: 3, $lte: 6 }  } ).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 7,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 7,
  "totalDocsExamined" : 7,
  "executionStages" : {
    "stage" : "FETCH",
    "filter" : {
      "ratings" : {
        "$gte" : 3
      }
    },
    "nReturned" : 7,
    "executionTimeMillisEstimate" : 0,
    "works" : 9,
    "advanced" : 7,
    "needTime" : 0,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 7,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 7,
      "executionTimeMillisEstimate" : 0,
      "works" : 8,
      "advanced" : 7,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings" : 1
      },
      "indexName" : "ratings_1",
      "isMultiKey" : true,
      "multiKeyPaths" : {
        "ratings" : [
          "ratings"
        ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings" : [
          "[-inf.0, 6.0]"
        ]
      },
      "keysExamined" : 7,
      "seeks" : 1,
      "dupsTested" : 7,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}
xiaoxu:PRIMARY>

4、等值查询ratings

逻辑:

1、查询数组值完全匹配100,200 2个元素且顺序是相同

备注:先匹配数组内任何元素满足100,然后返回文档判断是否满足整个数组,

如果100值特别多,100存在超过80%,最终结果集只有1个,那么回集合过滤匹配效果特别差

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:[100,200]}) 
备注:keysExamined=12,实际上等于100只有11个,多扫描一个索引key没有搞定
清楚
xiaoxu:PRIMARY> db.survey.find({ratings:100}).count()
11
xiaoxu:PRIMARY> db.survey.find({ratings:[100,200]}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 5,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 12,
  "totalDocsExamined" : 11,
  "executionStages" : {
    "stage" : "FETCH",
    "filter" : {
      "ratings" : {
        "$eq" : [
          100,
          200
        ]
      }
    },
    "nReturned" : 5,
    "executionTimeMillisEstimate" : 0,
    "works" : 13,
    "advanced" : 5,
    "needTime" : 7,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 11,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 11,
      "executionTimeMillisEstimate" : 0,
      "works" : 13,
      "advanced" : 11,
      "needTime" : 1,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings" : 1
      },
      "indexName" : "ratings_1",
      "isMultiKey" : true,
      "multiKeyPaths" : {
        "ratings" : [
          "ratings"
        ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings" : [
          "[100.0, 100.0]",
          "[[ 100.0, 200.0 ], [ 100.0, 200.0 ]]"
        ]
      },
      "keysExamined" : 12,
      "seeks" : 2,
      "dupsTested" : 11,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}
如不需要考虑顺序,使用$all操作符
db.survey.find({ ratings:{$all:[100,200]}}) 
这个执行只需要判断另外一个元素是否等于200.而不是整合数组匹配,扫描刚好是11
个索引key
xiaoxu:PRIMARY> db.survey.find({ratings:{$all:[100,200]}}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 5,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 11,
  "totalDocsExamined" : 11,
  "executionStages" : {
    "stage" : "FETCH",
    "filter" : {
      "ratings" : {
        "$eq" : 200
      }
    },

2、查询数组中至少一个元素等于100,效率还可以

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:100}) 
xiaoxu:PRIMARY> db.survey.find({ratings:100}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 2,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 2,
  "totalDocsExamined" : 2,
  "executionStages" : {
    "stage" : "FETCH",
    "nReturned" : 2,
    "executionTimeMillisEstimate" : 0,
    "works" : 3,
    "advanced" : 2,
    "needTime" : 0,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 2,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 2,
      "executionTimeMillisEstimate" : 0,
      "works" : 3,
      "advanced" : 2,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings" : 1
      },
      "indexName" : "ratings_1",
      "isMultiKey" : true,
      "multiKeyPaths" : {
        "ratings" : [
          "ratings"
        ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings" : [
          "[100.0, 100.0]"
        ]
      },
      "keysExamined" : 2,
      "seeks" : 1,
      "dupsTested" : 2,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}

5、通过数组长度查询数据

逻辑:

查询数组长度为1的对象,注意这个$size无法使用索引都是collscan.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ratings:{$size:1}})
xiaoxu:PRIMARY> db.survey.find({ratings:{$size:1}}).
explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 0,
  "executionTimeMillis" : 718,
  "totalKeysExamined" : 0,
  "totalDocsExamined" : 1000019,
  "executionStages" : {
    "stage" : "COLLSCAN",
    "filter" : {
      "ratings" : {
        "$size" : 1
      }
    },
    "nReturned" : 0,
    "executionTimeMillisEstimate" : 621,
    "works" : 1000021,
    "advanced" : 0,
    "needTime" : 1000020,
    "needYield" : 0,
    "saveState" : 7813,
    "restoreState" : 7813,
    "isEOF" : 1,
    "invalidates" : 0,
    "direction" : "forward",
    "docsExamined" : 1000019
  }
}
xiaoxu:PRIMARY>

6、通过数组索引位置来查询数据

逻辑:

1、数组索引位置从0开始,当对数组创建索引时,使用索引位置查询时,是无法使用多键索引,必须创建单独索引,例如第二个元素位置, db.survey.createIndex({"ratings.1":1}).其他位置以此内推方式创建索引.

2、创建数组索引还是按照数组索引位置创建索引,根据业务实际需求,做到创建索引能够提升效率,而不是创建低效或者无用索引。

3、查询单个元素,此时索引则不是多键索引,就是单个标量值,标量表示是字符串或者数字,而不是数组或者嵌套文档.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xiaoxu:PRIMARY> db.survey.find({"ratings.0":100}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 10,
  "executionTimeMillis" : 498,
  "totalKeysExamined" : 0,
  "totalDocsExamined" : 1000019,
  "executionStages" : {
    "stage" : "COLLSCAN",
    "filter" : {
      "ratings.0" : {
        "$eq" : 100
      }
    },
    "nReturned" : 10,
    "executionTimeMillisEstimate" : 450,
    "works" : 1000021,
    "advanced" : 10,
    "needTime" : 1000010,
    "needYield" : 0,
    "saveState" : 7812,
    "restoreState" : 7812,
    "isEOF" : 1,
    "invalidates" : 0,
    "direction" : "forward",
    "docsExamined" : 1000019
  }
}
xiaoxu:PRIMARY> 
xiaoxu:PRIMARY> db.survey.find({"ratings.1":100}).
explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 1,
  "executionTimeMillis" : 505,
  "totalKeysExamined" : 0,
  "totalDocsExamined" : 1000019,
  "executionStages" : {
    "stage" : "COLLSCAN",
    "filter" : {
      "ratings.1" : {
        "$eq" : 100
      }
    },
    "nReturned" : 1,
    "executionTimeMillisEstimate" : 410,
    "works" : 1000021,
    "advanced" : 1,
    "needTime" : 1000019,
    "needYield" : 0,
    "saveState" : 7812,
    "restoreState" : 7812,
    "isEOF" : 1,
    "invalidates" : 0,
    "direction" : "forward",
    "docsExamined" : 1000019
  }
}
xiaoxu:PRIMARY> db.survey.createIndex({"ratings.1":1})
{
  "createdCollectionAutomatically" : false,
  "numIndexesBefore" : 5,
  "numIndexesAfter" : 6,
  "ok" : 1
}
xiaoxu:PRIMARY> db.survey.find({"ratings.1":100}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 1,
  "executionTimeMillis" : 1,
  "totalKeysExamined" : 1,
  "totalDocsExamined" : 1,
  "executionStages" : {
    "stage" : "FETCH",
    "nReturned" : 1,
    "executionTimeMillisEstimate" : 0,
    "works" : 2,
    "advanced" : 1,
    "needTime" : 0,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 1,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 1,
      "executionTimeMillisEstimate" : 0,
      "works" : 2,
      "advanced" : 1,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings.1" : 1
      },
      "indexName" : "ratings.1_1",
      "isMultiKey" : false,
      "multiKeyPaths" : {
        "ratings.1" : [ ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings.1" : [
          "[100.0, 100.0]"
        ]
      },
      "keysExamined" : 1,
      "seeks" : 1,
      "dupsTested" : 0,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}
  • 【总结】

本次主要介绍数组多键索引,还包括数组嵌套文档、嵌套文档等多键索引,本次内容主要来自官方文档,主要补充执行计划等信息,并没有深入研究,只是作为入门学习了解,希望对大家有帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 udapp 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB 单键(列)索引
MongoDB支持基于集合文档上任意列创建索引。缺省情况下,所有的文档的_id列上都存在一个索引。基于业务的需要,可以基于一些重要的查询和操作来创建一些额外的索引。这些索引可以是单列,也可是多列(复合索引),多键索引,地理空间索引,文本索引以及哈希索引等。 本文主要描述在基于文档上的单列来创建索引。 一、创建语法 语法:db.collection.createIndex(keys, options) keys: 一个包含字段和值键值对的文档,指定该键即在该键上
Leshami
2018/08/13
1K0
MongoDB 单键(列)索引
MongoDB 聚合怎么写,更复杂的聚合案例
上期我们针对MongoDB的聚合操作进行了一个实例的操作并且发现了与传统数据库在操作和索引方面的有意思的不同。这次我们来继续深入聚合操作,我们这里换一个数据集合collection ,将我们的复杂度提高。
AustinDatabases
2024/07/04
1610
MongoDB  聚合怎么写,更复杂的聚合案例
Mongodb多键索引之嵌套文档
接上上一篇文档 Mongodb多键索引之数组,本次继续多键索引,到目前为止还没有分析业务中具体使用方式以及需求,只知道需要使用多键索引来满足不同查询,通过一个多键索引来解决不同谓词过滤,具体能否实现以及到底使用数组、嵌套文档还是数组文档方式?目前都是未知数,所以通过学习官方资料以及实际验证来解决如上2个问题.【能不能以及怎么做问题】,同时引出关键问题性能问题,选择一个能做方式满足业务需求,到底性能如何?
徐靖
2020/08/25
3K0
Mongodb多键索引之数组文档
接上2篇文档关于多键索引内容,接着学习数组文档,主要实验来验证如何进行高效数据查询,通过对比方式来验证3种多键索引优缺点以及适合场景,具体链接如下:
徐靖
2020/08/25
3.3K0
软件测试|Mongodb的分页优化及索引使用
基于我们的数据特性,在进行数据库选型时选择了mongo数据库。在文档数量很大的情况下,存在慢查询,影响服务端性能。合理地对数据库命令及索引进行优化,可以很大幅度提升接口性能
霍格沃兹测试开发Muller老师
2022/12/28
1.1K0
玩转MongoDB: 索引,速度的引领
数据库索引与书籍的索引类似,有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目后,就可以直接跳到目标文档的位置,这可以让查找的速度提高几个数量级。
MongoDB中文社区
2018/08/14
1.6K0
玩转MongoDB: 索引,速度的引领
初识MongoDB中的索引
索引就像图书的目录一样,可以让我们快速定位到需要的内容,关系型数据库中有索引,NoSQL中当然也有,本文我们就先来简单介绍下MongoDB中的索引。 本文是MongoDB系列的第九篇文章,了解前面的文章有助于更好的理解本文。 ---- 索引创建 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引: db.sang_collect.getIndexes() 结果如下: [ { "v" : 2, "key" : {
江南一点雨
2018/04/02
1.3K0
巧用MongoDB部分索引优化性能问题
最近研发提交业务需求,大概逻辑就是先统计总数,然后分页进行导出.SQL查询条件很简单。根据时间范围以及productTags字段必须存在作为条件.目前每天大约5000万数据量,数据保留6个月满足条件数据不多.但在没有索引的情况下,前端导出是卡死的.本次只讨论count性能问题,分页导数同样需要优化.具体SQL如下:
徐靖
2022/09/22
1.2K0
震撼揭秘:线上MongoDB慢查询终极优化实战解析
研发反馈指出,线上某个页面的响应速度异常缓慢,达到了16秒,严重影响了业务的正常运行。经过与研发的沟通得知,该页面调用的数据集合只会保留7天的数据,集合有6000万条记录。针对过期数据的处理,使用了根据 create_time 字段创建的过期索引,以自动使数据失效。此外,数据集合还通过 company_id 字段进行了哈希分片。
DBA实战
2024/09/06
1220
震撼揭秘:线上MongoDB慢查询终极优化实战解析
MongoDB复合索引详解
摘要: 对于MongoDB的多键查询,创建复合索引可以有效提高性能。 什么是复合索引? 复合索引,即Compound Index,指的是将多个键组合到一起创建索引,这样可以加速匹配多个键的查询。不妨通
Fundebug
2018/06/28
1.3K0
MongoDB查询索引分析
最近几年,nosql数据库发展迅猛,mongo无疑是最闪耀的那颗明星;以前我们部门的系统,用到数据库时基本上mysql是标配;现在越来越多的项目都开始选择mongo(无论自己搭建还是使用sa的ocean);无论是mysql还是mongo,数据库是一个系统最容易出现问题、瓶颈的地方。
kevindang
2018/06/17
8.6K3
MongoDB执行计划获取(db.collection.explain())
在RDBMS中,无论那种数据库,都提供了SQL剖析工具,用来解决SQL效率低下的问题。在MongoDB中,也有相应的策略来实现剖析。MongoDB提供了db.collection.explain()方法, cursor.explain()方法,和explain命令去返回查询计划信息和查询计划的执行统计信息。这为我们诊断查询提供了极大的便利,本文主要描述db.collection.explain()的相关用法。 一、db.collection.explain()简介 支持下列操作返回查询计划
Leshami
2018/08/13
1.5K0
MongoDB执行计划获取(db.collection.explain())
[953]mongo创建索引及索引相关方法
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
周小董
2021/03/11
3.7K0
[953]mongo创建索引及索引相关方法
云上MongoDB常见索引问题及最优索引规则大全
本文干货较多,建议收藏学习。先将文章结构速览奉上: 一、背景 二、MongoDB执行计划 2.1 queryPlanner信息 2.2 executionStats信息 2.3 allPlansExecution信息 三、云上用户建索引常见问题及优化方法 3.1 等值类查询常见问题及优化方法     3.1.1 同一类查询创建多个索引问题     3.1.2 多字段等值查询组合索引顺序非最优     3.1.3 最左原则包含关系引起的重复索引     3.1.4 唯一字段和其他字段组合引起的无用重复索引
腾讯云数据库 TencentDB
2022/04/07
2.3K0
云上MongoDB常见索引问题及最优索引规则大全
MongoDB profile分析慢查询
在MongoDB中,如果发生了慢查询,我们如何得到这些慢查询的语句,并优化呢?今天来看这块儿的一些心得。
AsiaYe
2021/05/10
2.3K0
MongoDB中null性能问题以及如何应对
在使用ORACLE、MYSQL以及MongoDB数据库时,其中查询时经常遇到NULL的性能问题,例如Oracle的索引中不记录全是NULL的记录,MongoDB中默认索引中会记录全是null的文档,MongoDB查询等于null时,表示索引字段对应值是null同时还包括字段不存在的文档.因为MongoDB是动态模式,允许每一行的字段都不一样,例如记录1中包括包括字段A等于1,记录2包括字段A等于null,记录3不包括字段A,那么索引中不仅会包括A等于null的文档,同时也记录不包括A字段的文档,同样会赋予null值(空数组属于特殊的).正是由于这些设计规则不同,难免在使用过程中就会遇到各种性能问题.常见查询包括统计null总数以及对应明细数据.其中以汇总统计为例.
徐靖
2022/12/19
2.5K0
MongoDB中null性能问题以及如何应对
MongoDB索引顺序导致慢SQL分析过程
最近监控MongoDB集群的慢日志,发现存在一个查询需要4s左右,返回结果集大部分情况下都为0(相当于SQL空跑),与研发沟通交流后,这个定时将检查已审核账单数据推送到ES中(双11时直接关闭这个功能,说明这个功能消耗资源)
徐靖
2022/08/23
8120
MongoDB索引顺序导致慢SQL分析过程
技术分享 | MongoDB 一次排序超过内存限制的排查
某次在客户现场处理一起APP业务中页面访问异常的问题,该页面直接是返回一行行硕大的报错代码,错误大概如下所示:
拓荒者
2019/07/04
3.4K0
玩转mongoDB(六):索引,速度的引领(普通索引篇)
数据库索引与书籍的索引类似,有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目后,就可以直接跳到目标文档的位置,这可以让查找的速度提高几个数量级。
壮壮熊
2022/08/18
6010
玩转mongoDB(六):索引,速度的引领(普通索引篇)
【翻译】MongoDB指南/CRUD操作(四)
【原文地址】https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选择最有效的查询方案。然后每次执行查询时,查询系统使用此查询方案。 查询优化程序仅缓存可能有多种切实可行的方案的查询计划。 对于每一个查询,查询规划者在查询方案高速缓存中搜索适合查询形式的查询方案。如果没有匹配的查询方案,查询规划者生成几个备选方案并在一个实验周期内做出评估。查询规划者选择获胜的方案,创建包含获胜
甜橙很酸
2018/03/08
1.9K0
【翻译】MongoDB指南/CRUD操作(四)
相关推荐
MongoDB 单键(列)索引
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档