Mongodb的入门(4)mongodb3.6的索引
Mongodb的索引:
在介绍索引之前,再强调一下nosql数据库和sql数据库的区别:
- sql数据库:结构化数据,定好了表格后,每一行的内容都是结构化的
- mongo:文档数据,表下的数据都可以有自己的特点(有自己独特的属性和值),存储更加灵活
索引介绍:
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
索引的内部构造:
- 所有的MongoDB集合默认都有一个唯一索引在字段“_id”上,如果应用程序没有为 “_id”列定义一个值,MongoDB将创建一个带有ObjectId值的列。(ObjectId是基于 时间、计算机ID、进程ID、本地进程计数器 生成的)
- MongoDB中的索引和其他数据库索引类似,也是使用B-Tree结构。MongoDB的索引是在collection(集合)级别上的,并且支持在任何列或者集合内的文档的子列中创建索引。
-
注:B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。
-
- MongoDB 同样支持在一列或多列上创建升序或降序索引
索引的分类:(我列出一些常用的,具体有多少参考官网 )
单一索引,多键索引、数组索引、空间索引、text索引、哈希索引,其属性可以是唯一性索引、稀疏性索引、TTL(time to live)索引等
官网索引类型截图如下:(具体的自己看)
索引的限制:
- 索引名称不能超过128个字符
- 每个集合不能超过64个索引
- 复合索引不能超过31列
索引的创建(在这我使用docs命令演示)
创建基础语法:
createIndex(keys,option):语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可
注意:在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
解释接收参数:(参考 http://www.runoob.com/mongodb/mongodb-indexing.html)
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
eg:
db.a.createIndex({x: 1}, {background: true}) 这就是在x创建升序索引,并在后台创建
其他关于索引的操作:参考官网
上面这些是基本的命令。具体怎么用呢,下面我来创建一波:
索引的命令:
单建索引
我在自己mongodb上以集合”a“为操作集合,由于以前创建索引的缘故。我先清除全部索引:
1.清除所有自建索引 db.a.dropIndexes() 默认的删除不了
2.查询集合a下的索引 db.a.getIndexes()
3.创建索引:db.a.createIndex({x:1},{background:true});(ensureIndex这种创建方式就不演示了)
注意:有个由于我没指定索引名,mongodb会为我们取一个默认的名字,规则为keyname1_dir1_keyname2_dir2...keynameN_dirN keyname表示键名,dir表示索引的方向,例如,上面的例子我们创建的索引名字就是x_1
4 ,查询一下,看看索引是不是在查询数据中生效:如下图:
上面是创建单建索引,下面我来介绍一下复合索引,
复合索引
db.a.createIndex({a:1,b:-1},{background:true,unique:true,name:"huhy"})
复合索引中会遇到的问题,在下图中我有说明:
注意:上面索引我指定了unique和name 属性,在截图中有体现:
还有索引的显示隐藏,边界值问题,大家可以参考官网
mongodb4版本已经发布,也可以看看新增加的特性,如事物特性,mongodb3之前不是没事物,有单文档事物属性,eg;每个文档的提交都是原子操作。但是多文档放在一起操作就无法保证原子性
本文来自博客园,作者:huhy,转载请注明原文链接:https://www.cnblogs.com/huhongy/p/9407891.html