zoukankan      html  css  js  c++  java
  • mongo: 索引

    索引创建

    在学习索引之前,我们先看一下,如果没有添加索引时,我们用explain()函数,查看查询计划是什么样的。

    发现使用的是BasicCursor,那么就代表我们没有索引,当我们查某一个数据的时候,就是从头到尾的扫一遍

    1. 索引提高查询速度,但是会降低写入和更改速度,权衡常用的查询字段,不必在太多列上建索引

    a)      新增一条数据的同时,还会新增索引文件,所以会降低写入和更改速度,所以需要权衡字段,没必要添加太多的索引

      2.在mongodb中,索引可以按字段升序(1)/降序(-1)来创建,便于排序

    -1:磁盘上,二叉树倒序排序,由大到小,我们人眼是看不出来的

      3.默认是用btree来组织所以文件,2.4版本以后,也允许建立hash索引

    索引的分类:

    常用命令:

    1. 查看当前索引状态:db.collection.getIndexes();
    2. 创建普通的单列索引:db.collection.ensureIndex(field:1/-1);//1代表升序,-1代表降序
    3. 创建多列索引:db.collection.ensureIndex(field:1/-1,field2:1/-1);

    我们如何优化mysql的时候,有多人说,为where语句常用的字段添加索引,但是仔细想想,这么说实际上是错误的,因为我们的where语句,经常会好几个字段一起用,但是只能有一个索引起作用。所以应该建立多列索引。在mongo中也是这样的

    多列索引和为每一个列都建立索引是不一样的,多列索引是把多个列看成一个整体,进行索引。如果两个列经常放在一起查,那么,使用多列索引要比在每一个列上加索引效率要高。

      4.创建子文档索引:db.collection.ensureIndex(field.subfield:1/-1);
    我们插入的数据为:

    db.shop.insert({name:’Nokia’,spc:{weight:120,area:’taiwan’}});

    {weight:120,area:’taiwan’}是子文档,如何在子文档中添加索引?使用点’.’,如下图

      5.创建唯一索引:db.collection.ensureIndex({field.subfield:1/-1},{unique:true});

    注意:唯一索引,这个列上的值不能重复,下图中,我们在添加了唯一索引的列email中,添加两条相同的值,会报error

     

      6.创建稀疏索引:

    稀疏索引的特点----如果针对field做索引,针对不含field列的文档,将不建立索引,与之相对,普通索引,会把该文档的field列的值认为NULL,并建立索引

    适宜于:小部分文档含有某列时

    db.collection.ensureIndex({field:1/-1},{sparse:true});

    创建非稀疏索引:结果如下:

    删除索引之后,再添加稀疏索引,结果如下

     

      7.创建哈希索引(2.4新增的)

    哈希索引速度比普通索引要快,但是无法对范围查询进行优化,适宜于—随机性强的散列

    简要介绍一下哈希索引:哈希索引是通过把key给哈希函数,然后通过哈希函数计算出一个唯一值,从而决定了这个数据存放在磁盘的什么位置上。所以值的存储是散列的,没有可循的规律性,当我们要查找一个数据的时候,比如查找学号为99的学生,我们可以这样。但是我们要查找200-500这样一个范围内的所有学生,哈希索引显然就不合适了。因为它的存储不是连续的,在这种情况普通索引就要好很多。

    db.collection.ensureIndex({field:’hashed’});

     

      8.删除单个索引

    db.collection.dropIndex({field:1/-1});//字段,和排序方式(1/-1)都需要指明

     

    删除所有索引

    db.collection.dropIndexes();

     

      9.重建索引

    _id索引是自带的,必须会有的

    email_1  升序排列

  • 相关阅读:
    USACO Sabotage
    USACO Telephone Lines
    NOIP 2012 借教室
    洛谷 P1902 刺杀大使
    VIJOS-P1450 包裹快递
    JDOJ 1770 埃及分数
    USACO Monthly Expense
    7.modifier插件的自定义和使用
    6.function自定义插件的方法和使用
    5.Smart使用内置函数或者自定义函数
  • 原文地址:https://www.cnblogs.com/mrxiaohe/p/6700536.html
Copyright © 2011-2022 走看看