• 【MongoDB】索引 - 复合索引


    一、准备工作

    这里准备一些学生数据

    1. db.students.insertMany([
    2. { _id: 1, name: "张三", age: 20, class: { id: 1, name: "1班" }},
    3. { _id: 2, name: "李四", age: 22, class: { id: 2, name: "2班" }},
    4. { _id: 3, name: "王五", age: 24, class: { id: 3, name: "3班" }},
    5. ]);

    二、创建复合索引

    1、创建索引

    db.students.createIndex({ age: 1, name: 1 });

    上面创建了age、name字段的复合索引,其中1代表的是正序排序,-1代表的是倒序排序

    复合查询中可以定义多个字段(最多不能超过32个字段)作为索引,但是在查询时只有使用携带第一个索引字段作为查询条件时才会使用当前索引

    2、查询索引

    db.students.getIndexes();

    结果如下:

    可以看到多了一个名称为age_1_name_1的索引

    三、示例1:使用姓名和年龄查询

    1、执行查询

    1. db.students.find({
    2. age: { $gt: 21 },
    3. name: '李四'
    4. });

    结果如下:

    2、执行过程

    1. db.students.find({
    2. age: { $gt: 21 },
    3. name: '李四'
    4. }).explain();

    结果如下:

    可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)

    四、示例2:使用年龄查询

    1、执行查询

    1. db.students.find({
    2. age: { $gt: 21 }
    3. });

    结果如下:

    2、执行过程

    1. db.students.find({
    2. age: { $gt: 21 }
    3. }).explain();

    结果如下:

    可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)

    五、示例3:使用姓名查询

    1、执行查询

    1. db.students.find({
    2. name: '李四'
    3. });

    结果如下:

    2、执行过程

    1. db.students.find({
    2. name: '李四'
    3. }).explain();

    结果如下:

    可以看到查询过程中未使用到索引名称为age_1_name_1的索引(查询时未使用age字段)

    六、示例4:使用年龄和班级查询

    1、执行查询

    1. db.students.find({
    2. age: { $gt: 21 },
    3. 'class.id': 3
    4. });

    结果如下:

    2、执行过程

    1. db.students.find({
    2. age: { $gt: 21 },
    3. 'class.id': 3
    4. }).explain();

    结果如下:

    可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)

  • 相关阅读:
    【JVM学习】Jconsole 配置jmx 监控JVM
    计算机网络的基础知识
    10.28总结
    漏洞扫描工具的编写
    运筹说 第72期 | 算法介绍之动态规划(二)
    HackTheBox Photobomb 命令注入与远程代码执行和环境变量提权
    设计模式-单例模式
    【问题思考总结】块和页框的大小相等吗?(从抽象层次的角度思考)
    序列化与反序列化及不同序列化方式的性能对比
    低代码高拓展性依托何物?一起来探究一番!
  • 原文地址:https://blog.csdn.net/m1729339749/article/details/134228290