来自:mjsws > 馆藏分类
配色: 字号:
MongoDB数据库索引管理方法
2018-10-04 | 阅:  转:  |  分享 
  
MongoDB数据库索引管理方法MongoDB索引索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多
列的值进行排序的一种结构;使用索引的优点:索引通常能够极大的提高查询的效率,这是由于索引储存在内存中,同时索引本身的遍历效率必普通
集合更高;使用索引带来的代价:额外的操作开销,在进行插入、更新、删除操作时,也需要对索引进行操作,如果是查询少、更改多的集合,使用
索引是很不划算的;额外的内存开销,由于索引是储存在内存中的,应该确保索引大小不超过内存限制(如果索引大小操作内存限制,mongod
b会删除一些索引,导致性能下降);mongdb的索引存在以下限制:一个集合的索引不能超过64个;索引名长度不能超过128
个字符;一个复合索引最多只能由31个;索引不能用以下查询:正则表达式查询,$regex;非操作符查询,如$nin,$not
等;算术运算符,如$mod等;$where操作符子句;创建索引为集合创建索引使用可以?ensureIndex({:<1|
-1>},{key:索引使用的键,1表示正序,-1表示倒序;option:可接受参数,参数列表如下:background:?
-创建索引是否会阻塞其他数据库操作,默认值false;name:?-?索引的名称,如果未指定,mongodb会通过索引的字段
名和排序顺序生成一个索引名称;unique:?-建立索引是否唯一,默认为false;dropDups:?-在建立唯一索引时,
是否会删除重复记录,默认为false;sparse:?-对文档中不存在的字段是否不启用索引,如果设置为true,在索引字段中
不会出现查询不包含对应字段的索引,默认为false;expireAfterSeconds:?-设定查询集合在内存中的生存时间(
TTL设定);v:?-索引的版本号,默认为mongo创建索引时运行的版本;weights:?-索引的权重值,表示该索引对于
其他索引字段的得分权重,范围在[1,99999];default_language:?-指定文本索引停用词、词干、词器的规则的
咧白哦,默认为en英语;language_override:?-指定文本索引包含在文档中的字段名、语言覆盖默认的langu
age,默认为language;??1#为col集合创建索引,索引字段为title,正序?1db.col.ensureI
ndex({title:1})?1#为col集合创建复合索引,索引字段为title,score,正序,正序?1db.c
ol.ensureIndex({title:1,score:1})?1#创建索后台进行?1db.col.ensureInd
ex({title:1},{backgroud:true})索引覆盖查询在创建了索引之后,mongodb在进行索引时,如果
查询的字段已经被建立了索引,那么mongodb并不会真正去数据库中查询这些字段,而是直接在已经建立的索引中提取数据(这个速度远
远高于直接在数据库中查询),即此时mongodb会使用索引覆盖查询;需要注意的是,mongodb默认的查询会返回_id字
段,如果没有对_id字段进行索引,是不会使用索引覆盖查询的;?天地棋牌http://www.dadiqipaigw.cn?
1db.col.ensureIndex({title:1,score:1})?#为col集合中的title、sco
re字段建立索引;?1db.col.find({title:"helloworld"},{score:1,_id:0}
)#该查询会被以上索引覆盖,mongodb直接在索引中查询;?1db.col.find({title:"hellowor
ld"},{score:1})????#该索引没有被以上索引覆盖,mongodb在数据库中查询,原因是含有没有被索
引覆盖的_id字段;?1db.col.find({title:"helloworld"})???????
??#该索引没有被以上索引覆盖,原因是含有没有被索引覆盖的_id字段;※如果是以下类型查询,无法使用索引覆盖查询:索引
字段是一个数组;索引字段是一个子文档;索引数组字段?假设要检索下列user文档的tages数组:??1{??1?"na
me":"assad",?1?"tags":[?1???"coder",?1???"fatnerd",?1???
"philosophy♂"?1?]?1}可以使用以下命名来创建数组索引,当为整个数组创建索引之后,会为数组里的所有值单独创建索引
:??1>db.users.ensureIndex({tages:1})验证检索结果:??1>db.users.find(
{tages:"coder"}).explain()索引子文档字段假设要检索下列user文档的address子文档,通
过city、state、pincode字段来创建user的检索,由于这些字段为user的子文档address的字
段,需要对address文档创建检索:??1{??1?"name":"assad",?1?"address":{?1?
??"city":"Guanzhou",?1???"state":"Guangdong",?1???"pincod
e":"510000"?1?}?1}可以使用以下创建address子文档全部字段的索引:??1>db.users.fin
d({address.city:1,address.state:1,address.pincode:1})验证检索结果:?
?1>db.users.find({address.city:"Guangdong",address.state:"Guna
gzhou"}).explain()查看索引&删除索引??1#查看数据库中所有的索引?1>db.system.inde
xs.find()?1.....?1??1#查看集合中的索引?1>db.col.getIndexes()?1[?1?{?1?
??"v":2,?1???"key":{?1?????"_id":1?1???},?1?
??"name":"_id_",?1???"ns":"testdb.articles"?1?},?1?{?1
???"v":2,?1???"key":{?1?????"title":1?1???},?
1???"name":"title_1",?1???"ns":"testdb.articles"?1?}?1
]?1??1#查看索引大小,单位bytes?1>db.articles.totalIndexSize()?153248?1?
?1#删除所有索引?1>db.articles.dropIndexes()?1??1#删除指定name的索引?1>db
.srticles.dropIndex("title_1")索引查询分析explain()方法?可以使用explain()方
法用于获取查询的信息、索引使用情况、查询统计等信息,方便对索引进行优化;?638棋牌http://www.rodlg.com?1
>db.articles.ensureIndex({author:1,title:1})??#创建索引?1>db.ar
ticles.find({author:"assad"},{title:1,_id:0}).explain()??#使用e
xplain函数进行查询分析返回信息中于索引相关的信息:??1?"inputStage":{?1???"stage":
"IXSCAN",?1???"keyPattern":{?1???????"author":1,?1?
??????"title":1?1???},?1???"indexName":"author_1_tit
le_1",?1???"isMultiKey":false,?1???"multiKeyPaths":{?1??
?????"author":[],?1???????"title":[]?1???},?1?
??"isUnique":false,?1???"isSparse":false,?1???"isPartia
l":false,?1???"indexVersion":2,?1???"direction":"forwar
d",?1???"indexBounds":{?1???????"author":[?1?????
??????"[\"assad\",\"assad\"]"?1???????],?1?????
??"title":[?1???????????"[MinKey,MaxKey]"?1???????]?1???}?1}hint()方法hint()方法用于强制mongodb使用一个指定的索引,如下,同样也可以使用explain()方法来分析以下索引;??1>db.users.find({author:''assad''},{title:1,_id:0}).hint({author:1,title:1})
献花(0)
+1
(本文系mjsws首藏)