(四)索引的类型三:复合索引(Compound Index)**

MongoDB支持复合索引,即将多个键组合到一起创建索引。该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的情形。其次复合索引在使用的时候,也可以通过前缀法来使用索引。MongoDB中的复合索引与关系型数据库基本上一致。在关系型数据库中复合索引使用的一些原则同样适用于MongoDB。

在前面的内容中,我们已经在emp集合上创建了一个复合索引,如下:

db.emp.createIndex({"deptno":1,"sal":-1})

下面使用不同的过滤条件查询文档,查看相应的执行计划:

(1)仅使用deptno作为过滤条件

db.emp.find({"deptno":10}).explain()

(2)使用deptno、sal作为过滤条件

db.emp.find({"deptno":10,"sal":3000}).explain()

(3)使用deptno、sal作为过滤条件,但把sal放在前面

db.emp.find({"sal":3000,"deptno":10}).explain()

(4)仅使用sal作为过滤条件

db.emp.find({"sal":3000}).explain()

(五)复合索引与排序

复合索引创建时按升序或降序来指定其排列方式。对于单键索引,其顺序并不是特别重要,因为MongoDB可以在任一方向遍历索引。对于复合索引,按何种方式排序能够决定该索引在查询中能否被使用到。

db.emp.createIndex({"deptno":1,"sal":-1})

在前面的内容中,我们已经在deptno上按照升序、sal上按照降序建立了复合索引,下面测试不同的排序的下,是否执行了索引:

使用了索引的情况:db.emp.find().sort({"deptno":1,"sal":-1}).explain()db.emp.find().sort({"deptno":-1,"sal":1}).explain()没有使用索引的情况:db.emp.find().sort({"deptno":1,"sal":1}).explain()db.emp.find().sort({"deptno":-1,"sal":-1}).explain()交换两个列的位置,再进行测试。

(六)复合索引与索引前缀

索引前缀指的是复合索引的子集,假如存在如下索引:

db.emp.createIndex({"deptno":1,"sal":-1,"job":1})那么就存在以下的索引前缀:{"deptno":1}{"deptno":1,"sal":-1}

在MongoDB中,下列查询过滤条件情形中,索引将会被使用到:

db.emp.find().sort({deptno:1,sal:-1,job:1}).explain()db.emp.find().sort({deptno:1,sal:-1}).explain()db.emp.find().sort({deptno:1}).explain()

下列查询过滤条件情形中,索引将不会被使用到:

db.emp.find().sort({deptno:1,job:1}).explain()db.emp.find().sort({sal:-1,job:1}).explain()

(七)小结

  • 复合索引是基于多个键(列)上创建的索引
  • 复合索引在创建的时候可以为其每个键(列)来指定排序方法
  • 索引键列的排序方法影响查询在排序时候的操作,方向一致或相反的才能被匹配
  • 复合索引与前缀索引通常在匹配的情形下才能被使用

go mongodb排序查询_「赵强老师」MongoDB中的索引(下)相关推荐

  1. go mongodb排序查询_【赵强老师】MongoDB中的索引(下)

    (四)索引的类型三:复合索引(Compound Index) MongoDB支持复合索引,即将多个键组合到一起创建索引.该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的情形 ...

  2. javacore分析工具_「赵强老师」如何分析Java的内存溢出问题

    一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出. 在J ...

  3. nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅

    Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型 ...

  4. dbf如何导入oracle_「赵强老师」第一个Oracle的手工管理的备份和恢复

    一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子来为大家介绍如何使用手工的方式来完成Oracle ...

  5. 【赵强老师】SQL中的子查询

    ​先看视频,视频全长73分钟,相信对大家有帮助. [赵强老师]SQL中的子查询 这里主要向大家介绍了Oracle数据库之Oracle子查询之简单子查询,通过具体的内容向大家展现,希望对大家学习Orac ...

  6. oracle select 行数据_【赵强老师】什么是Oracle的数据字典?

    欢迎关注赵强老师微信公众号:myitshare 数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一 ...

  7. oracle 锁表如何查看_【赵强老师】第一个Oracle的手工备份和恢复

    欢迎关注赵强老师微信公众号:myitshare 一.什么是手工管理的备份与恢复? 尽管在Oracle中,已经有了RMAN的备份与恢复.但是作为Oracle备份恢复的一种方式,我们将在本文中通过一个例子 ...

  8. hprof文件分析工具_【赵强老师】如何分析Java的内存溢出问题

    欢迎关注赵强老师微信公众号:myitshare 一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你 ...

  9. redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅

    欢迎关注赵强老师微信公众号:myitshare Redis 作为一个publish/subscribe server,起到了消息路由的功能.订阅者可以通过subscribe和psubscribe命令向 ...

最新文章

  1. linux手机远程桌面连接软件下载,HomeCenter手机远程桌面下载_HomeCenter手机远程桌面官方下载-太平洋下载中心...
  2. 手把手教你做挖矿应急响应
  3. extjs 表单设置html5,ExtJS 配置和表格控件使用
  4. php对扑克牌进行排序,C#代码实现扑克牌排序的几种方式
  5. Bootstrap 弹出提示插件Popover 的方法
  6. 微课|玩转Python轻松过二级(2.1.1):常量与变量
  7. Servlet笔记10--Session
  8. 360录屏时去掉跑马灯解决方法 以失败告终
  9. nod32更新服务无法设置问题更改
  10. 2018年【计算机视觉+机器学习+人工智能】领域重要会议汇总
  11. Html5网页录音,js录音mp3
  12. 地图标识符号大全_【好玩微信小游戏大全】虫虫逃亡:烧脑游戏佳作!强烈推荐!...
  13. 基于群智能算法的函数最值优化问题
  14. Unity URP贴花系统的简单使用
  15. Linux cat命令使用
  16. java判断或_Java判断用户名和密码是否符合要求过程详解
  17. WPS:将彻底关闭广告
  18. 抓adg端口防封最详细教程(已更新)
  19. Python 实现延时队列
  20. echarts 柱状图渐变

热门文章

  1. 题库练习1(单词长度、统计字符个数、)
  2. 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
  3. 一个快速实现彩屏应用的跨平台快速原型开发工具平台,最重要的是还免费!8ms.xyz平台原以为是单片机版墨刀,今天上去玩了才知道平台厉害的很,基于WEB端免搭建开发环境,跑的还是C代码编译出来的程序!
  4. 启明云端WT516P6Core离线语音模块发布后,开发者朋友提出的问题最多的是:是否可以自己编译指令
  5. php可以独立运行,【判断题】PHP不能独立运行,只能和Apache服务器一同使用( )。...
  6. 导致集群重启_解析 Elasticsearch 棘手问题,集群的 RED 与 YELLOW
  7. 斐波那契数列python递归 0、1、1、2、3_python: 递归和递推方法求斐波那契数列
  8. art-template-loader:template
  9. idea中查看类的继承关系图
  10. 混编ObjectiveC++