zoukankan      html  css  js  c++  java
  • MongoDB索引的简单理解

    MongoDB索引

    1.语法准备

    • ​ explain() :查看执行计划
    • ​ getIndexes() :查看所有索引
    • ​ hint() : 强制使用某一索引进行查询

    2.数据准备:

    {
        "_id" : ObjectId("6127594238754d0067383ff6"),
        "xh" : 1,
        "szly" : {
            "lymc" : "AA大厦",
            "z" : "A",
            "lh" : "1",
            "sy" : "啥意思"
        },
        "qtxx" : {
            "nsssjg" : "A、区内",
            "sfwkgh" : "否",
            "cylx" : "第三产业",
            "rzlysj" : "2011.11",
            "fwcqdw" : "河南置业有限公司",
            "fwszlc" : "5",
            "fjh" : "601、604",
            "mj" : 56,
            "cyry" : 5,
            "yzj" : 2,
            "qylx" : "H、其他",
            "ssqylx" : "C、非上市企业",
            "lxr" : "AA兰",
            "lxdh" : "85685685"
        },
        "sssq" : "裕鸿楼宇社区",
        "frxx" : {
            "qyfr" : "AA兰",
            "qyfzr" : "AA兰",
            "lxfs" : "18888888888"
        },
        "qyjbxx" : {
            "xy" : "P 教育",
            "qymc" : "郑州市管城回族培训学校",
            "gsyyzzh" : "31313123",
            "swdjzh" : "123123123",
            "tyxydm" : "313123123",
            "zcdz" : "裕鸿国际A座6层",
            "jjxz" : "有限责任公司",
            "zczb" : 100
        },
        "importMonth" : "202108",
        "batch" : "1629968706400_1",
        "createBy" : "1",
        "department" : "区政府",
        "createTime" : ISODate("2021-08-26T09:05:06.416Z"),
        "status" : 0,
        "ddly" : {
            "zh" : "",
            "lh" : "",
            "sy" : ""
        },
        "lcxx" : {
            "zb" : "",
            "szlc" : "",
            "mj" : ""
        },
        "updateBy" : "1",
        "updateTime" : "2021-08-27 11:14:31"
    }
    

    3.索引

    3.1 唯一索引

     默认索引:_id(唯一性的索引)

     唯一索引会保证索引对应的键不会出现相同的值,如果唯一索引所在的字段有重复数据写入时,抛出异常。

    db.getCollection("qydrmb_copy").createIndex({"qtjbxx":1},{unique:true})
    

    3.2 单键索引

     最普通索引,不会自动创建。

     创建单建索引示例

    db.getCollection("qydrmb_copy").createIndex({"qtjbxx":1})
    
    db.getCollection("qydrmb_copy").createIndex({"qtxx.fwcqdw":1})
    

    注意

    • ​ qydrmb_copy:集合名称

    • ​ qtjbxx:集合字段名

    • ​ qtxx.fwcqdw:集合中子集合字段名

    • ​ 1:升序排序

    • ​ -1:降序排序

    3.3 多键索引

     多键索引和单键索引创建形式一样,区别:字段的值,值具有多个记录,如,数组

    注意:通过 getIndexes() 不能区分该索引是单键索引还是多键索引,可以 explain() 执行计划的打印信息中查看(isMultKey 属性)

    3.4 复合索引

     复合索引针对多个字段联合创建索引,先按照第一个字段排序,第一个字段相同的文档按照第二个字段排序,依次类推。

     语法:

    db.collection_name.createIndex({索引键名:排序规则, 索引键名:排序规则, ...})
    

     复合索引能满足的查询场景比单字段索引更丰富,不光能满足多个字段组合起来的查询,也能满足所有能匹配符合索引前缀的查询。

    注意:创建一个复合索引 A、B, 查询条件中包含A,B会走索引,查询条件中包含A,也会走索引,查询条件中没有A,只有一个B,此时不会走索引。A就称为索引前缀。

    3.5 交叉索引

     交叉索引就是为了一个集合的多个字段分别建立索引,在查询的时候通过多个字段作为查询条件,这种情况称为交叉索引。

     交叉索引和复合索引区别:交叉索引 A、B是两个索引,复合索引中 A、B组成了一个索引。

    注意:一个集合中包含交叉索引A、 B,在查询条件中包含A、或者包含B、或者包含A、B的情况下,都会触发交叉索引。

    3.6 部分索引

     部分索引是针对符合某个特定条件的文档建立索引,3.2版本才支持该特性。

     MongoDB 部分索引只为那些在一个集合中,满足指定的筛选条件的文档创建索引。简单理解就是部分索引是带有过滤条件的索引,即索引只存在于某些文档之上

    ​ 语法:

    db.collection_name.createIndex({索引键名:排序规则},{partialFilterExpression:{"前面进行排序的键名":{匹配条件:条件值}}})
    

    注意:部分索引和唯一所以一块使用,唯一约束只适用于满足筛选条件的文档。

    3.7覆盖索引

     1.所有的查询字段是索引的一部分

     2.查询返回的所有字段在同一个索引中

    例如:如果一个索引中包含A、B 两个字段,查询条件只有一个A, 返回结果为 A、B两个字段,则此时会触发覆盖索引,即不再扫描整个文档,而是直接从索引中获取数据。

    3.8 全文索引

     全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

     MongoDB 从 2.4 版本开始支持全文检索,目前支持15种语言的全文索引(danish、dutch、english、finnish、french、german、hungarian、italian、norwegian、portuguese、romanian、russian、spanish、swedish、turkish)。

     mongo2.6之后默认开启全文检索。

    创建语法:

    db.collection_name.ensureIndex({全文索引的字段名:"text"})
    

    查询语法:

    db.collection_name.find({$text:{$search:"检索的值"}})
    

    4.索引限制

    4.1 查询限制

    • 索引不能被以下查询使用:

    • 正则表达式(最左匹配除外)及非操作符,如$nin,$not等

    • 算数运算符,如 $mod 等。

    • 可以使用explain()来查看是否执行了索引

    4.2 范围限制

    • 集合中索引不能超过64个

    • 索引名的长度不能超过128个字符

    • 一个符合索引最多可以有31个字段

    • 索引的大小不能超过内存的限制,如果超出限制,Mongo会删除一些索引,会导致性能下降。

    作者:学海无涯519
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
  • 相关阅读:
    Redis简单梳理及集群配置
    PDF.js 详情解说
    基于SMS短信平台给手机发送短信
    linux装OpenOffice后传---中文乱码的解决
    NodeJs小试牛刀--聊天室搭建
    算法之路--最小代价生成树
    Linux系统上安装OpenOffice
    项目部署之工具使用心得
    H5 Handlebars的简单使用
    JavaWeb国际化
  • 原文地址:https://www.cnblogs.com/wgx519/p/15268943.html
Copyright © 2011-2022 走看看