"keyPattern" : {
"info" : 1
},
"indexName" : "info_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"info" : [
"[{ city: "beijing" }, { city: "beijing" }]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "mycentos.WORKGROUP",
"port" : 27017,
"version" : "3.2.8",
"gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"
},
"ok" : 1
}
但是这样的查询就不行:
>db.data.find({"info.city":"beijing"}); //字段部分必须加引号
>db.data.find({info.url:"..."});
这样的查询语句,只能使用类似的组合索引:
> db.data.ensureIndex({"info.url":1, "info.city":1});
5.组合索引
> db.data.ensureIndex({"info.url":1, "info.city":1});
即使查询时,与定义的排序相反,也是可以使用索引扫描的。
rs0:PRIMARY> db.data.find({"info.url": /http:*/i}).sort({"info.url": -1, "info.city":-1}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.data",
"indexFilterSet" : false,
"parsedQuery" : {
"info.url" : /http:*/i
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"filter" : {
"info.url" : /http:*/i
},
"keyPattern" : {
"info.url" : 1,
"info.city" : 1
},
"indexName" : "info.url_1_info.city_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "backward",
"indexBounds" : {
"info.url" : [
"[/http:*/i, /http:*/i]",
"({}, ""]"
],
"info.city" : [
"[MaxKey, MinKey]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "mycentos.WORKGROUP",
"port" : 27017,
"version" : "3.2.8",
"gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"
},
"ok" : 1
}
mongodb中在嵌套子文档的文档上面建立索引
标签:mongodb
小编还为您整理了以下内容,可能对您也有帮助:
mongodb建立索引&查看索引&删除索引
从Robo 3T可视化界面中,去创建mongodb数据表的索引。
1.数据表结构:{_id:value, doc_city:value, doc_province:value, content, judgementId}
2.content字段展开:
3.对content字段里的title/caseType/judgementType建立索引
db.getCollection('chongqing').createIndex({"content.title":1, "content.judgementType":1, "content.caseType":1})
4.让创建索引的过程在后台运行
db.getCollection('chongqing').createIndex({"content.title":1, "content.judgementType":1, "content.caseType":1},{background:true})
5.查询集合索引
db.getCollection('chongqing').getIndexes()
6.查看索引集合大小
db.getCollection('chongqing').totalIndexSize()
7.删除集合所有索引
db.getCollection('chongqing').dropIndexes()
8.删除集合指定索引
db.getCollection('chongqing').dropIndex('索引名')
spring mongo 怎么建立索引
1.创建索引
1)创建单个索引
db.collection.ensureIndex({a:1})
在a字段上创建一个升序的索引(对于单个字段的索引,升序或是降序都一样)。
2)创建复合索引
db.collection.ensureIndex({a:1,b:-1})
3)创建稀疏索引
db.collection.ensureIndex({a:1},{sparse:true})
索引中将不包含没有a字段的文档。
4)创建唯一索引
db.collection.ensureIndex({a:1},{unique:true})
为a字段建立唯一索引。
当mongo要索引一个字段时,如果一篇文档中没有这个字段,这篇文档就会被索引为null,
因为唯一索引不能有重复值,所以必须和稀疏索引配合使用,如:
db.collection.ensureIndex({a:1},{unique:true,sparse:true})
复合索引也可以加唯一*,如:
db.collection.ensureIndex({a:1,b:1},{unique:true})
5)在后台创建索引
db.collection.ensureIndex({a:1},{background:true})
6)丢弃重复数据
要强制在一个有重复数据的字段上创建唯一索引,可以使用dropDups选项,这会强制mongo
在创建唯一索引时删除重复数据(危险操作),如:
db.collection.ensureIndex({a:1},{dropDups:true})
2.查看索引
1)查看某个库上的所有索引
db.system.index.find()
2)查看某个表上的所有索引
db.collection.getIndexes()
3.删除索引
1)删除表上的某个索引
db.collection.dropIndex({a:1})
2)删除表上的所有索引
db.collection.dropIndexes()
4.重建索引
db.collection.reIndex()
以上操作会删除表上的所有索引(包含_id)并重建所有索引。
5.在副本集上创建索引
后台创建索引操作在一个副本集的从节点(secondary)上会变成前台操作,这时创建索引的操作会
阻塞从节点上的所有的复制和读操作。
从节点会在主节点完成创建索引的操作后开始创建索引,在分片集群环境(sharded cluster)中,
mongos会向每个分片上的副本集环境的主节点发送ensureIndex(),然后在主节点完成创建索引后
复制到从节点上。
为了在副本集环境中将创建索引的影响降低到最小,使用以下方法在从节点上创建索引:
1)在一个从节点上停止mongod进程,使用另一个端口号不采用–replSet选项重启mongod进程,这
个mongod实例现在已”独立”(standalone)模式运行;
2)在这个mongod实例上创建新索引或者重建索引;
3)采用–replSet选项重启mongod实例。允许复制操作catch up这个成员;
4)在其它的从节点上重复这个操作;
5)在这个集(set)上的主节点上运行rs.stepDown(),然后在之前的主节点上重复这个过程。
6.索引中的升序键和降序键
对于单个键的索引,键的顺序没有关系。但是对于符合索引,键的升、降顺序有很大影响。
比如说一个表包含用户名(username)和该用户发表文章的时间(time),如果你需要经常查询某用户最
新发表的文章,你应该创建这样的索引:
db.collection.ensureIndex({“username”:1,”time”:-1})
7.索引的*
1)一个表上的索引不能超过64个;
2)索引的键不能超过1024bytes();
3)索引的名字(包含命名空间)必须少于128个字符;
8.索引策略
MongoDB对于每个操作只能使用一个索引,$or的每一个子句可以使用自己的索引。
对于下边的索引:
db.collection.ensureIndex({“category”:1,”item”:1})
无论单独查询category、item,还是两者一起查询,该索引都有效。但是有个例外,使用$or操作符时,
一个查询不能使用复合索引,只能使用单个索引。
一个多字段的复合索引可以支持所有在这些字段上就前缀子集进行查询的需求,例如:
db.collection.ensureIndex({x:1,y:1,z:1})
以上索引可以支持如下查询需求:
db.collection.find({x:232})
db.collection.find({x:232,y:3})
db.collection.find({x:232,y:3,z:34})
索引{x:1,y:1,z:1}可以支持一些索引{x:1,z:1}支持的查询?
对于查询db.collection.find({x:5}).sort({z:1}),索引{x:1,z:1}既支持查询页支持排序,而索引
{x:1,y:1,z:1}只支持查询?
使用索引为查询的结果排序:
比如有这样一个索引
db.collection.ensureIndex({a:1,b:1,c:1,d:1})
以下的查询和排序操作可以使用索引:
db.collection.find().sort({a:1})
db.collection.find().sort({a:1,b:1})
db.collection.find({a:4}).sort({a:1,b:1})
db.collection.find({b:5}).sort({a:1,b:1})
db.collection.find({a:5}).sort({b:1,c:1})
db.collection.find({a:5,c:4,b:3}).sort({d:1})
db.collection.find({a:{$gt:4}}).sort({a:1,b:1})
db.collection.find({a:{$gt:5}}).sort({a:1,b:1})
db.collection.find({a:5, b:3,d:{$gt:4}}).sort({c:1})
db.collection.find({a:5, b:3,c:{$lt:2},d:{$gt:4}}).sort({c:1})
以下的查询和排序不能使用索引:
db.collection.find().sort( { b:1 } )
db.collection.find( { b:5 } ).sort( { b:1 } )
对于不使用索引的sort()操作,当使用超过32Mb内存时,sort()操作将退出。
spring mongo 怎么建立索引
1.创建索引
1)创建单个索引
db.collection.ensureIndex({a:1})
在a字段上创建一个升序的索引(对于单个字段的索引,升序或是降序都一样)。
2)创建复合索引
db.collection.ensureIndex({a:1,b:-1})
3)创建稀疏索引
db.collection.ensureIndex({a:1},{sparse:true})
索引中将不包含没有a字段的文档。
4)创建唯一索引
db.collection.ensureIndex({a:1},{unique:true})
为a字段建立唯一索引。
当mongo要索引一个字段时,如果一篇文档中没有这个字段,这篇文档就会被索引为null,
因为唯一索引不能有重复值,所以必须和稀疏索引配合使用,如:
db.collection.ensureIndex({a:1},{unique:true,sparse:true})
复合索引也可以加唯一*,如:
db.collection.ensureIndex({a:1,b:1},{unique:true})
5)在后台创建索引
db.collection.ensureIndex({a:1},{background:true})
6)丢弃重复数据
要强制在一个有重复数据的字段上创建唯一索引,可以使用dropDups选项,这会强制mongo
在创建唯一索引时删除重复数据(危险操作),如:
db.collection.ensureIndex({a:1},{dropDups:true})
2.查看索引
1)查看某个库上的所有索引
db.system.index.find()
2)查看某个表上的所有索引
db.collection.getIndexes()
3.删除索引
1)删除表上的某个索引
db.collection.dropIndex({a:1})
2)删除表上的所有索引
db.collection.dropIndexes()
4.重建索引
db.collection.reIndex()
以上操作会删除表上的所有索引(包含_id)并重建所有索引。
5.在副本集上创建索引
后台创建索引操作在一个副本集的从节点(secondary)上会变成前台操作,这时创建索引的操作会
阻塞从节点上的所有的复制和读操作。
从节点会在主节点完成创建索引的操作后开始创建索引,在分片集群环境(sharded cluster)中,
mongos会向每个分片上的副本集环境的主节点发送ensureIndex(),然后在主节点完成创建索引后
复制到从节点上。
为了在副本集环境中将创建索引的影响降低到最小,使用以下方法在从节点上创建索引:
1)在一个从节点上停止mongod进程,使用另一个端口号不采用–replSet选项重启mongod进程,这
个mongod实例现在已”独立”(standalone)模式运行;
2)在这个mongod实例上创建新索引或者重建索引;
3)采用–replSet选项重启mongod实例。允许复制操作catch up这个成员;
4)在其它的从节点上重复这个操作;
5)在这个集(set)上的主节点上运行rs.stepDown(),然后在之前的主节点上重复这个过程。
6.索引中的升序键和降序键
对于单个键的索引,键的顺序没有关系。但是对于符合索引,键的升、降顺序有很大影响。
比如说一个表包含用户名(username)和该用户发表文章的时间(time),如果你需要经常查询某用户最
新发表的文章,你应该创建这样的索引:
db.collection.ensureIndex({“username”:1,”time”:-1})
7.索引的*
1)一个表上的索引不能超过64个;
2)索引的键不能超过1024bytes();
3)索引的名字(包含命名空间)必须少于128个字符;
8.索引策略
MongoDB对于每个操作只能使用一个索引,$or的每一个子句可以使用自己的索引。
对于下边的索引:
db.collection.ensureIndex({“category”:1,”item”:1})
无论单独查询category、item,还是两者一起查询,该索引都有效。但是有个例外,使用$or操作符时,
一个查询不能使用复合索引,只能使用单个索引。
一个多字段的复合索引可以支持所有在这些字段上就前缀子集进行查询的需求,例如:
db.collection.ensureIndex({x:1,y:1,z:1})
以上索引可以支持如下查询需求:
db.collection.find({x:232})
db.collection.find({x:232,y:3})
db.collection.find({x:232,y:3,z:34})
索引{x:1,y:1,z:1}可以支持一些索引{x:1,z:1}支持的查询?
对于查询db.collection.find({x:5}).sort({z:1}),索引{x:1,z:1}既支持查询页支持排序,而索引
{x:1,y:1,z:1}只支持查询?
使用索引为查询的结果排序:
比如有这样一个索引
db.collection.ensureIndex({a:1,b:1,c:1,d:1})
以下的查询和排序操作可以使用索引:
db.collection.find().sort({a:1})
db.collection.find().sort({a:1,b:1})
db.collection.find({a:4}).sort({a:1,b:1})
db.collection.find({b:5}).sort({a:1,b:1})
db.collection.find({a:5}).sort({b:1,c:1})
db.collection.find({a:5,c:4,b:3}).sort({d:1})
db.collection.find({a:{$gt:4}}).sort({a:1,b:1})
db.collection.find({a:{$gt:5}}).sort({a:1,b:1})
db.collection.find({a:5, b:3,d:{$gt:4}}).sort({c:1})
db.collection.find({a:5, b:3,c:{$lt:2},d:{$gt:4}}).sort({c:1})
以下的查询和排序不能使用索引:
db.collection.find().sort( { b:1 } )
db.collection.find( { b:5 } ).sort( { b:1 } )
对于不使用索引的sort()操作,当使用超过32Mb内存时,sort()操作将退出。
MongoDB 索引
Nothing like a little truth to sober you up.
唯有事实最能让人清醒。
索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
如果查询存在适当的索引,MongoDB可以使用该索引必须检查的文档数。
索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。
官网文档: https://docs.mongodb.com/manual/indexes/
MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)
MongoDB的索引可以分为:单字段索引、复合索引以及地理空间索引等。
单字段索引:MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引(Single Field Index)。
对于单个字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上遍历索引。
复合索引:MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。
复合索引中列出的字段顺序具有重要意义。例如,如果复合索引由 { userid: 1, score: -1 } 组成,则索引首先按userid正序排序,然后在每个userid的值内,再在按score倒序排序。
其他索引:
地理空间索引(Geospatial Index):为了支持对地理空间坐标数据的有效查询,MongoDB提供了两种特殊的索引:返回结果时使用平面几何的二维索引和返回结果时使用球面几何的二维球面索引。
文本索引(Text Indexes):MongoDB提供了一种文本索引类型,支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停止词(例如“the”、“a”、“or”),而将集合中的词作为词干,只存储根词。
哈希索引(Hashed Indexes):为了支持基于散列的分片,MongoDB提供了散列索引类型,它对字段值的散列进行索引。这些索引在其范围内的值分布更加随机,但只支持相等匹配,不支持基于范围的查询。
查看索引
返回一个集合中的所有索引的数组
语法格式 : db.collection.getIndexes()
提示 :该语法命令运行要求是MongoDB 3.0+
示例
结果中显示的是默认 _id 索引。
默认_id索引 :MongoDB在创建集合的过程中,在 _id 字段上创建一个唯一的索引,默认名字为 id ,该索引可防止客户端插入两个具有相同值的文档,您不能在_id字段上删除此索引。
注意 :该索引是唯一索引,因此值不能重复,即 _id 值不能重复的。在分片集群中,通常使用 _id 作为片键。
创建索引
在集合上创建索引。
语法格式 : db.collection.createIndex(keys, options)
参数说明 :
options(更多选项)列表:
注意 :在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex() ,之后的版本使用了 db.collection.createIndex() 方法, ensureIndex() 还能用,但只是 createIndex() 的别名。
实例
移除索引
可以移除指定的索引,或移除所有索引
语法格式 : db.collection.dropIndex(index) 或移除所有索引 db.collection.dropIndexes()
参数说明 :
实例
提示 : _id 的字段的索引是无法删除的,只能删除非 _id 字段的索引。
执行计划
分析查询性能(Analyze Query Performance)通常使用执行计划(解释计划、Explain Plan)来查看查询的情况,如查询耗费的时间、是否基于索引查询等。
那么,通常,我们想知道,建立的索引是否有效,效果如何,都需要通过执行计划查看。
语法格式 : db.collection.find(query,options).explain(options)
实例
涵盖查询Covered Queries
当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。 这些覆盖的查询可以非常有效。
我的理解是类似于mysql的索引覆盖,无须回表查询。
实例
有故事的人,通常不喜欢讲故事。不想在嘴上卖力,是想在心中开发能量。沉默,是一种负重的坚强,是一种韬光养晦的低调。少说多做,才是最有力的践行。
mongodb 索引是什么数据结构
MongoDB索引使用B-tree数据结构。
索引支持MongoDB中查询的高效执行。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用索引来*它必须检查的文档数。
扩展资料
MongoDB索引的类型
1、单字段索引(Single Field Index)
这个是最简单最常用的索引类型,比如我们上边的例子,为id建立一个单独的索引就是此种类型。
2、复合索引(Compound Index)
索引field的先后顺序很关键,影响有两方面:
(1)MongoDB在复合索引中是根据prefix排序查询,就是说排在前面的可以单独使用。
(2)过滤出的document越少的field越应该放在前面,比如此例中id如果是唯一的,那么就应该放在最前面,因为这样通过id就可以锁定唯一一个文档。而如果通过city或者score过滤完成后还是会有大量文档,这就会影响最终的性能。
索引的排序顺序不同:复合索引最末尾的field,其排序顺序不同对于MongoDB的查询排序操作是有影响的。
3、多key索引(Multikey Index):主要针对数据类型为数组的类型。
4、其它类型索引:另外,MongoDB中还有其它如哈希索引,地理位置索引以及文本索引,主要用于一些特定场景。
mongodb 索引是什么数据结构
MongoDB索引使用B-tree数据结构。
索引支持MongoDB中查询的高效执行。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用索引来*它必须检查的文档数。
扩展资料
MongoDB索引的类型
1、单字段索引(Single Field Index)
这个是最简单最常用的索引类型,比如我们上边的例子,为id建立一个单独的索引就是此种类型。
2、复合索引(Compound Index)
索引field的先后顺序很关键,影响有两方面:
(1)MongoDB在复合索引中是根据prefix排序查询,就是说排在前面的可以单独使用。
(2)过滤出的document越少的field越应该放在前面,比如此例中id如果是唯一的,那么就应该放在最前面,因为这样通过id就可以锁定唯一一个文档。而如果通过city或者score过滤完成后还是会有大量文档,这就会影响最终的性能。
索引的排序顺序不同:复合索引最末尾的field,其排序顺序不同对于MongoDB的查询排序操作是有影响的。
3、多key索引(Multikey Index):主要针对数据类型为数组的类型。
4、其它类型索引:另外,MongoDB中还有其它如哈希索引,地理位置索引以及文本索引,主要用于一些特定场景。
mongodb新插入数据时需要重新建索引吗
1. 索引的创建
mongodb采用ensureIndex来创建索引,如:
db.user.ensureIndex({"name":1})
表示在user集合的name键创建一个索引,这里的1表示索引创建的方向,可以取值为1和-1
在这里面,我们没有给索引取名字,mongodb会为我们取一个默认的名字,规则为keyname1_dir1_keyname2_dir2...keynameN_dirN
keyname表示键名,dir表示索引的方向,例如,上面的例子我们创建的索引名字就是name_1
索引还可以创建在多个键上,也就是联合索引,如:
> db.user.ensureIndex({"name":1,"age":1})
这样就创建了name和age的联合索引
除了让mongodb默认索引的名字外,我们还可以去一个方便记的名字,方法就是为ensureIndex指定name的值,如:
> db.user.ensureIndex({"name":1},{"name":"IX_name"})
这样,我们创建的索引的名字就叫IX_name了
2. 唯一索引
与RDB类似,我们也可以定义唯一索引,方法就是指定unique键位true:
>db.user.ensureIndex({"name":1},{"unique":true})
3.查看我们建立的索引
索引的信息存在每个数据库的system.indexes集合里面,对这个集合只能有ensureIndex和dropIndexes进行修改,不能手动插入或修改集合。
通过> db.system.indexes.find()可以找到数据库中多有的索引:
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.entities", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.blog", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.authors", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.papers", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.analytics", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.user", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.food", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.user.info", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.userinfo", "name" : "_id_" }
{ "v" : 1, "key" : { "name" : 1 }, "ns" : "test.user", "name" : "IX_name" }
4.删除索引
如果索引没有用了,可以使用dropIndexes将其删掉:
> db.runCommand({"dropIndexes":"user","index":"IX_name"})
{ "nIndexesWas" : 2, "ok" : 1 }
ok表示删除成功
mongodb新插入数据时需要重新建索引吗
1. 索引的创建
mongodb采用ensureIndex来创建索引,如:
db.user.ensureIndex({"name":1})
表示在user集合的name键创建一个索引,这里的1表示索引创建的方向,可以取值为1和-1
在这里面,我们没有给索引取名字,mongodb会为我们取一个默认的名字,规则为keyname1_dir1_keyname2_dir2...keynameN_dirN
keyname表示键名,dir表示索引的方向,例如,上面的例子我们创建的索引名字就是name_1
索引还可以创建在多个键上,也就是联合索引,如:
> db.user.ensureIndex({"name":1,"age":1})
这样就创建了name和age的联合索引
除了让mongodb默认索引的名字外,我们还可以去一个方便记的名字,方法就是为ensureIndex指定name的值,如:
> db.user.ensureIndex({"name":1},{"name":"IX_name"})
这样,我们创建的索引的名字就叫IX_name了
2. 唯一索引
与RDB类似,我们也可以定义唯一索引,方法就是指定unique键位true:
>db.user.ensureIndex({"name":1},{"unique":true})
3.查看我们建立的索引
索引的信息存在每个数据库的system.indexes集合里面,对这个集合只能有ensureIndex和dropIndexes进行修改,不能手动插入或修改集合。
通过> db.system.indexes.find()可以找到数据库中多有的索引:
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.entities", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.blog", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.authors", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.papers", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.analytics", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.user", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.food", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.user.info", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.userinfo", "name" : "_id_" }
{ "v" : 1, "key" : { "name" : 1 }, "ns" : "test.user", "name" : "IX_name" }
4.删除索引
如果索引没有用了,可以使用dropIndexes将其删掉:
> db.runCommand({"dropIndexes":"user","index":"IX_name"})
{ "nIndexesWas" : 2, "ok" : 1 }
ok表示删除成功
mongodb 建索引需要多久
给你一个我的参考值,我的数据库大概2000多万条数据,花了6分钟左右,如果使用background,需要7分钟左右,自己实际操作一下就知道自己的
mongodb 建索引需要多久
给你一个我的参考值,我的数据库大概2000多万条数据,花了6分钟左右,如果使用background,需要7分钟左右,自己实际操作一下就知道自己的
mongodb 建立索引为什么不会产生索引碎片
mongodb配置文件/etc/mongodb.conf中的配置项,其实都是mongod启动选项(和memcached一样)
[root@Node7 ~]# mongod --helpAllowed options:General options: -h [ --help ] show this usage information --version show version information -f [ --config ] arg configuration file specifying additional options -v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv) --quiet quieter output --port arg specify port number - 27017 by default --bind_ip arg comma separated list of ip addresses to listen on - all local ips by default --maxConns arg max number of simultaneous connections - 20000 by default --logpath arg log file to send write to instead of stdout - has to be a file, not directory --logappend append to logpath instead of over-writing --pidfilepath arg full path to pidfile (if not set, no pidfile is created) --keyFile arg private key for cluster authentication --setParameter arg Set a configurable parameter --nounixsocket disable listening on unix sockets --unixSocketPrefix arg alternative directory for UNIX domain sockets (defaults to /tmp) --fork fork server process --syslog log to system‘s syslog facility instead of file or stdout --auth run with security --cpu periodically show cpu and iowait utilization --dbpath arg directory for datafiles - defaults to /data/db/ --diaglog arg 0=off 1=W 2=R 3=both 7=W+some reads --directoryperdb each database will be stored in a separate directory --ipv6 enable IPv6 support (disabled by default) --journal enable journaling --journalCommitInterval arg how often to group/batch commit (ms) --journalOptions arg journal diagnostic options --jsonp allow JSONP access via http (has security implications) --noauth run without security --nohttpinterface disable http interface --nojournal disable journaling (journaling is on by default for 64 bit) --noprealloc disable data file preallocation - will often hurt performance --noscripting disable scripting engine --notablescan do not allow table scans --nssize arg (=16) .ns file size (in MB) for new databases --profile arg 0=off 1=slow, 2=all --quota limits each database to a certain number of files (8 default) --quotaFiles arg number of files allowed per db, requires --quota --repair run repair on all dbs --repairpath arg root directory for repair files - defaults to dbpath --rest turn on simple rest api --shutdown kill a running server (for init scripts) --slowms arg (=100) value of slow for profile and console log --smallfiles use a smaller default file size --syncdelay arg (=60) seconds between disk syncs (0=never, but not recommended) --sysinfo print some diagnostic system information --upgrade upgrade db if neededReplication options: --oplogSize arg size to use (in MB) for replication op log. default is 5% of disk space (i.e. large is good)Master/slave options (old; use replica sets instead): --master master mode --slave slave mode --source arg when slave: specify master as <server:port> --only arg when slave: specify a single database to replicate --slavedelay arg specify delay (in seconds) to be used when applying master ops to slave --autoresync automatically resync if slave data is staleReplica set options: --replSet arg arg is <setname>[/<optionalseedhostlist>] --replIndexPrefetch arg specify index prefetching behavior (if secondary) [none|_id_only|all]Sharding options: --configsvr declare this is a config db of a cluster; default port 27019; default dir /data/configdb --shardsvr declare this is a shard db of a cluster; default port 27018SSL options: --sslOnNormalPorts use ssl on configured ports --sslPEMKeyFile arg PEM file for ssl --sslPEMKeyPassword arg PEM file password --sslCAFile arg Certificate Authority file for SSL --sslCRLFile arg Certificate Revocation List file for SSL --sslWeakCertificateValidation allow client to connect without presenting a certificate --sslFIPSMode activate FIPS 140-2 mode at startup
常用配置参数:
fork={true|false} mongod是否运行于后台
bind_ip=IP 指定监听地址
port=PORT 指定监听的端口,默认为27017
maxConns=N 指定最大并发连接数
syslog=/PATH/TO/SAME_FILE 指定日志文件
httpinterface=true 是否启动web监控功能,端口为mongod端口 + 1000
journal 是否启动事务日志,默认已启动
slowms arg (=100) 设定慢查询,单位为ms,超过设定的时间就为慢查询,默认100ms
repair 意外关闭时,应该启用这样来修复数据
二、索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
1、索引的类型
B+ Tree、hash、空间索引、全文索引
MongoDB支持的索引:
单字索引、组合索引(多字段索引)、
多键索引:索引创建在值为键值对上的索引
空间索引:基于位置查找
文本索引:相当于全文索引
hash索引:精确查找,不适用于范围查找
2、索引的管理
创建:
db.mycoll.ensureIndex(keypattern[,options])
查看帮助信息:
db.mycoll.ensureIndex(keypattern[,options]) - options is an object with these possible fields: name, unique, dropDups
db.COLLECTION_NAME.ensureIndex({KEY:1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。db.col.ensureIndex({"title":1,"description":-1})
ensureIndex() 接收可选参数,可选参数列表如下:
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. |
查询:
db.mycoll.getIndex()
删除:
db.mycoll.dropIndexes() 删除当前集合的所有索引
db.mycoll.dropIndexes("index") 删除指定索引
db.mycoll.reIndex() 重新构建索引,
实例:
> db.students.find()> for (i=1;i<=100;i++) db.students.insert({name:"student"+i, age:(i%100)}) # 使用for循环 > db.students.find().count()100> db.students.find(){ "_id" : ObjectId("58d613021e8383d30814f846"), "name" : "student1", "age" : 1 }{ "_id" : ObjectId("58d613021e8383d30814f847"), "name" : "student2", "age" : 2 }{ "_id" : ObjectId("58d613021e8383d30814f848"), "name" : "student3", "age" : 3 }{ "_id" : ObjectId("58d613021e8383d30814f849"), "name" : "student4", "age" : 4 }{ "_id" : ObjectId("58d613021e8383d30814f84a"), "name" : "student5", "age" : 5 }{ "_id" : ObjectId("58d613021e8383d30814f84b"), "name" : "student6", "age" : 6 }{ "_id" : ObjectId("58d613021e8383d30814f84c"), "name" : "student7", "age" : 7 }{ "_id" : ObjectId("58d613021e8383d30814f84d"), "name" : "student8", "age" : 8 }{ "_id" : ObjectId("58d613021e8383d30814f84e"), "name" : "student9", "age" : 9 }{ "_id" : ObjectId("58d613021e8383d30814f84f"), "name" : "student10", "age" : 10 }{ "_id" : ObjectId("58d613021e8383d30814f850"), "name" : "student11", "age" : 11 }{ "_id" : ObjectId("58d613021e8383d30814f851"), "name" : "student12", "age" : 12 }{ "_id" : ObjectId("58d613021e8383d30814f852"), "name" : "student13", "age" : 13 }{ "_id" : ObjectId("58d613021e8383d30814f853"), "name" : "student14", "age" : 14 }{ "_id" : ObjectId("58d613021e8383d30814f854"), "name" : "student15", "age" : 15 }{ "_id" : ObjectId("58d613021e8383d30814f855"), "name" : "student16", "age" : 16 }{ "_id" : ObjectId("58d613021e8383d30814f856"), "name" : "student17", "age" : 17 }{ "_id" : ObjectId("58d613021e8383d30814f857"), "name" : "student18", "age" : 18 }{ "_id" : ObjectId("58d613021e8383d30814f858"), "name" : "student19", "age" : 19 }{ "_id" : ObjectId("58d613021e8383d30814f859"), "name" : "student20", "age" : 20 }Type "it" for more # 只显示前20个,it显示更多> db.students.ensureIndex({name:1}) # 在name键上构建索引,1表示升序,-1表示降序> show collectionsstudentssystem.indexest1> db.students.getIndexes()[{ # 默认的索引"v" : 1, "name" : "_id_","key" : {"_id" : 1},"ns" : "students.students" # 数据库.集合},{"v" : 1,"name" : "name_1", # 自动生成的索引名"key" : { "name" : 1 # 在name键上创建的索引},"ns" : "students.students" }]> db.students.dropIndexes("name_1") # 删除指定索引{"nIndexesWas" : 2,"msg" : "non-_id indexes dropped for collection","ok" : 1}> db.students.getIndexes()[{"v" : 1,"name" : "_id_","key" : {"_id" : 1},"ns" : "students.students"}]> db.students.dropIndexes() # 默认的索引无法删除,{"nIndexesWas" : 1,"msg" : "non-_id indexes dropped for collection","ok" : 1}> db.students.getIndexes()[{"v" : 1,"name" : "_id_","key" : {"_id" : 1},"ns" : "students.students"}> db.students.find({age:"90"}).explain() # 显示查询过程{"cursor" : "BtreeCursor t1","isMultiKey" : false,"n" : 0,"nscannedObjects" : 0, "nscanned" : 0,"nscannedObjectsAllPlans" : 0,"nscannedAllPlans" : 0,"scanAndOrder" : false,"indexOnly" : false,"nYields" : 0,"nChunkSkips" : 0,"millis" : 17,"indexBounds" : { # 使用的索引"age" : [["90","90"]]},"server" : "Node7:27017"}
三、MongoDB的分片
1、分片简介
随着业务发展,当数据集越来越大,CPU、Memory、IO出现瓶颈,就需要对mongodb进行扩展。
增加mongodb只能均衡读压力,不能均衡写压力,就需要对数据集分片。
mongodb原生支持分片
MySQL:的分片解决方案
Gizzard, HiveDB, MySQL Proxy + HSACLE, Hibernate Shard, Pyshards
2、分片架构中的角色
mongos:Router
相当于代理,将用户请求路由到合适的分片上执行,本身不存储数据也不查询数据,
config server:元数据服务器,也需要多个,但不是副本集,需要借助其它工具实现如zookeeper
存放的是shard服务器上存储的数据集的索引
shard: 数据节点,也称mongod实例
zookeeper:
常用于实现分布式系统中心节点协调,能够提供选举并选举出主节点机制;zookeeper本身也可以自行做分布式。
3、分片的方式
分片是基于collection
为保证每个shard节点上数据集均衡,将每个collectin切割成大小固定的chunk(块),然后逐个分配给shard节点,
基于范围切片
range
基于列表切片
list
基于hash切片
hash
写离散,读集中
db.enableSharding("testdb")
【MongoDB】03、MongoDB索引及分片
标签:mongodb
mongodb 建立索引为什么不会产生索引碎片
mongodb配置文件/etc/mongodb.conf中的配置项,其实都是mongod启动选项(和memcached一样)
[root@Node7 ~]# mongod --helpAllowed options:General options: -h [ --help ] show this usage information --version show version information -f [ --config ] arg configuration file specifying additional options -v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv) --quiet quieter output --port arg specify port number - 27017 by default --bind_ip arg comma separated list of ip addresses to listen on - all local ips by default --maxConns arg max number of simultaneous connections - 20000 by default --logpath arg log file to send write to instead of stdout - has to be a file, not directory --logappend append to logpath instead of over-writing --pidfilepath arg full path to pidfile (if not set, no pidfile is created) --keyFile arg private key for cluster authentication --setParameter arg Set a configurable parameter --nounixsocket disable listening on unix sockets --unixSocketPrefix arg alternative directory for UNIX domain sockets (defaults to /tmp) --fork fork server process --syslog log to system‘s syslog facility instead of file or stdout --auth run with security --cpu periodically show cpu and iowait utilization --dbpath arg directory for datafiles - defaults to /data/db/ --diaglog arg 0=off 1=W 2=R 3=both 7=W+some reads --directoryperdb each database will be stored in a separate directory --ipv6 enable IPv6 support (disabled by default) --journal enable journaling --journalCommitInterval arg how often to group/batch commit (ms) --journalOptions arg journal diagnostic options --jsonp allow JSONP access via http (has security implications) --noauth run without security --nohttpinterface disable http interface --nojournal disable journaling (journaling is on by default for 64 bit) --noprealloc disable data file preallocation - will often hurt performance --noscripting disable scripting engine --notablescan do not allow table scans --nssize arg (=16) .ns file size (in MB) for new databases --profile arg 0=off 1=slow, 2=all --quota limits each database to a certain number of files (8 default) --quotaFiles arg number of files allowed per db, requires --quota --repair run repair on all dbs --repairpath arg root directory for repair files - defaults to dbpath --rest turn on simple rest api --shutdown kill a running server (for init scripts) --slowms arg (=100) value of slow for profile and console log --smallfiles use a smaller default file size --syncdelay arg (=60) seconds between disk syncs (0=never, but not recommended) --sysinfo print some diagnostic system information --upgrade upgrade db if neededReplication options: --oplogSize arg size to use (in MB) for replication op log. default is 5% of disk space (i.e. large is good)Master/slave options (old; use replica sets instead): --master master mode --slave slave mode --source arg when slave: specify master as <server:port> --only arg when slave: specify a single database to replicate --slavedelay arg specify delay (in seconds) to be used when applying master ops to slave --autoresync automatically resync if slave data is staleReplica set options: --replSet arg arg is <setname>[/<optionalseedhostlist>] --replIndexPrefetch arg specify index prefetching behavior (if secondary) [none|_id_only|all]Sharding options: --configsvr declare this is a config db of a cluster; default port 27019; default dir /data/configdb --shardsvr declare this is a shard db of a cluster; default port 27018SSL options: --sslOnNormalPorts use ssl on configured ports --sslPEMKeyFile arg PEM file for ssl --sslPEMKeyPassword arg PEM file password --sslCAFile arg Certificate Authority file for SSL --sslCRLFile arg Certificate Revocation List file for SSL --sslWeakCertificateValidation allow client to connect without presenting a certificate --sslFIPSMode activate FIPS 140-2 mode at startup
常用配置参数:
fork={true|false} mongod是否运行于后台
bind_ip=IP 指定监听地址
port=PORT 指定监听的端口,默认为27017
maxConns=N 指定最大并发连接数
syslog=/PATH/TO/SAME_FILE 指定日志文件
httpinterface=true 是否启动web监控功能,端口为mongod端口 + 1000
journal 是否启动事务日志,默认已启动
slowms arg (=100) 设定慢查询,单位为ms,超过设定的时间就为慢查询,默认100ms
repair 意外关闭时,应该启用这样来修复数据
二、索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
1、索引的类型
B+ Tree、hash、空间索引、全文索引
MongoDB支持的索引:
单字索引、组合索引(多字段索引)、
多键索引:索引创建在值为键值对上的索引
空间索引:基于位置查找
文本索引:相当于全文索引
hash索引:精确查找,不适用于范围查找
2、索引的管理
创建:
db.mycoll.ensureIndex(keypattern[,options])
查看帮助信息:
db.mycoll.ensureIndex(keypattern[,options]) - options is an object with these possible fields: name, unique, dropDups
db.COLLECTION_NAME.ensureIndex({KEY:1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。db.col.ensureIndex({"title":1,"description":-1})
ensureIndex() 接收可选参数,可选参数列表如下:
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. |
查询:
db.mycoll.getIndex()
删除:
db.mycoll.dropIndexes() 删除当前集合的所有索引
db.mycoll.dropIndexes("index") 删除指定索引
db.mycoll.reIndex() 重新构建索引,
实例:
> db.students.find()> for (i=1;i<=100;i++) db.students.insert({name:"student"+i, age:(i%100)}) # 使用for循环 > db.students.find().count()100> db.students.find(){ "_id" : ObjectId("58d613021e8383d30814f846"), "name" : "student1", "age" : 1 }{ "_id" : ObjectId("58d613021e8383d30814f847"), "name" : "student2", "age" : 2 }{ "_id" : ObjectId("58d613021e8383d30814f848"), "name" : "student3", "age" : 3 }{ "_id" : ObjectId("58d613021e8383d30814f849"), "name" : "student4", "age" : 4 }{ "_id" : ObjectId("58d613021e8383d30814f84a"), "name" : "student5", "age" : 5 }{ "_id" : ObjectId("58d613021e8383d30814f84b"), "name" : "student6", "age" : 6 }{ "_id" : ObjectId("58d613021e8383d30814f84c"), "name" : "student7", "age" : 7 }{ "_id" : ObjectId("58d613021e8383d30814f84d"), "name" : "student8", "age" : 8 }{ "_id" : ObjectId("58d613021e8383d30814f84e"), "name" : "student9", "age" : 9 }{ "_id" : ObjectId("58d613021e8383d30814f84f"), "name" : "student10", "age" : 10 }{ "_id" : ObjectId("58d613021e8383d30814f850"), "name" : "student11", "age" : 11 }{ "_id" : ObjectId("58d613021e8383d30814f851"), "name" : "student12", "age" : 12 }{ "_id" : ObjectId("58d613021e8383d30814f852"), "name" : "student13", "age" : 13 }{ "_id" : ObjectId("58d613021e8383d30814f853"), "name" : "student14", "age" : 14 }{ "_id" : ObjectId("58d613021e8383d30814f854"), "name" : "student15", "age" : 15 }{ "_id" : ObjectId("58d613021e8383d30814f855"), "name" : "student16", "age" : 16 }{ "_id" : ObjectId("58d613021e8383d30814f856"), "name" : "student17", "age" : 17 }{ "_id" : ObjectId("58d613021e8383d30814f857"), "name" : "student18", "age" : 18 }{ "_id" : ObjectId("58d613021e8383d30814f858"), "name" : "student19", "age" : 19 }{ "_id" : ObjectId("58d613021e8383d30814f859"), "name" : "student20", "age" : 20 }Type "it" for more # 只显示前20个,it显示更多> db.students.ensureIndex({name:1}) # 在name键上构建索引,1表示升序,-1表示降序> show collectionsstudentssystem.indexest1> db.students.getIndexes()[{ # 默认的索引"v" : 1, "name" : "_id_","key" : {"_id" : 1},"ns" : "students.students" # 数据库.集合},{"v" : 1,"name" : "name_1", # 自动生成的索引名"key" : { "name" : 1 # 在name键上创建的索引},"ns" : "students.students" }]> db.students.dropIndexes("name_1") # 删除指定索引{"nIndexesWas" : 2,"msg" : "non-_id indexes dropped for collection","ok" : 1}> db.students.getIndexes()[{"v" : 1,"name" : "_id_","key" : {"_id" : 1},"ns" : "students.students"}]> db.students.dropIndexes() # 默认的索引无法删除,{"nIndexesWas" : 1,"msg" : "non-_id indexes dropped for collection","ok" : 1}> db.students.getIndexes()[{"v" : 1,"name" : "_id_","key" : {"_id" : 1},"ns" : "students.students"}> db.students.find({age:"90"}).explain() # 显示查询过程{"cursor" : "BtreeCursor t1","isMultiKey" : false,"n" : 0,"nscannedObjects" : 0, "nscanned" : 0,"nscannedObjectsAllPlans" : 0,"nscannedAllPlans" : 0,"scanAndOrder" : false,"indexOnly" : false,"nYields" : 0,"nChunkSkips" : 0,"millis" : 17,"indexBounds" : { # 使用的索引"age" : [["90","90"]]},"server" : "Node7:27017"}
三、MongoDB的分片
1、分片简介
随着业务发展,当数据集越来越大,CPU、Memory、IO出现瓶颈,就需要对mongodb进行扩展。
增加mongodb只能均衡读压力,不能均衡写压力,就需要对数据集分片。
mongodb原生支持分片
MySQL:的分片解决方案
Gizzard, HiveDB, MySQL Proxy + HSACLE, Hibernate Shard, Pyshards
2、分片架构中的角色
mongos:Router
相当于代理,将用户请求路由到合适的分片上执行,本身不存储数据也不查询数据,
config server:元数据服务器,也需要多个,但不是副本集,需要借助其它工具实现如zookeeper
存放的是shard服务器上存储的数据集的索引
shard: 数据节点,也称mongod实例
zookeeper:
常用于实现分布式系统中心节点协调,能够提供选举并选举出主节点机制;zookeeper本身也可以自行做分布式。
3、分片的方式
分片是基于collection
为保证每个shard节点上数据集均衡,将每个collectin切割成大小固定的chunk(块),然后逐个分配给shard节点,
基于范围切片
range
基于列表切片
list
基于hash切片
hash
写离散,读集中
db.enableSharding("testdb")
【MongoDB】03、MongoDB索引及分片
标签:mongodb
请MongoDB的索引六种类型。
请MongoDB的索引六种类型。
正确答案:单字段索引:在文档的单个字段上创建用户定义的升序/降序索引。复合索引:包含多个字段的索引,一个复合索引最多可以包含31个字段。多键索引:MongoDB会为数组中的每个元素创建索引。地理空间索引:对地理空间坐标数据的有效查询,包含平面几何的二维索引和球面几何的二维球面索引。文本索引:在集合中搜索字符串内容,即进行文本检索查询。哈希索引:哈希索引是使用哈希函数来计算索引字段的哈希值。
为什么有关MongoDB采用B树索引,以及Mysql B+树做索引
事实上,在MySQL数据库中,诸多存储引擎使用的是B+树,即便其名字看上去是BTREE。
4.1 innodb的索引机制
先以innodb存储引擎为例,说明innodb引擎是如何利用B+树建立索引的
首先创建一张表:zodiac,并插入一些数据
对于innodb来说,只有一个数据文件,这个数据文件本身就是用B+树形式组织,B+树每个节点的关键字就是表的主键,因此innode的数据文件本身就是主索引文件,如下图所示,主索引中的叶子页(leaf page)包含了数据记录,但非叶子节点只包含了主键,术语“聚簇”表示数据行和相邻的键值紧凑地存储在一起,因此这种索引被称为聚簇索引,或聚集索引。
这种索引方式,可以提高数据访问的速度,因为索引和数据是保存在同一棵B树之中,从聚簇索引中获取数据通常比在非聚簇索引中要来得快。
所以可以说,innodb的数据文件是依靠主键组织起来的,这也就是为什么innodb引擎下创建的表,必须指定主键的原因,如果没有显式指定主键,innodb引擎仍然会对该表隐式地定义一个主键作为聚簇索引。
同样innodb的辅助索引,如下图所示,假设这些字符是按照生肖的顺序排列的(其实我也不知道具体怎么实现,不要在意这些细节,就是举个例子),其叶子节点中也包含了记录的主键,因此innodb引擎在查询辅助索引的时候会查询两次,首先通过辅助索引得到主键值,然后再查询主索引,略微有点啰嗦