MongoDB索引的一些问题和使用规则

背景

由于项目业务需要用到大数据量,且对事务方面要去不高,所以从各种数据库中挑选出mongodb非关系数据库为最优解,但是业务数据越来越多,导致页面接口查询效率变低。

-索引分类

  • 唯一索引
  • 复合索引
  • 部分索引

创建索引

createIndex() 方法
MongoDB 中可以使用 createIndex() 方法来创建索引,其语法格式如下
db.collection_name.createIndex(keys, options)
参数说明如下:

  • keys:由键/值对组成,其中键用来定义要创建索引的字段,值用来定义创建索引的顺序,1 表示按升序创建索引,-1 表示按降序来创建索引;
  • options:可选参数,其中包含一组控制索引创建的选项,可选值如下表所示。
参数类型描述
**backgroundBoolean可选参数,当值为 true 时,表示在后台构建索引,避免在创建索引的过程阻塞其它数据库操作,默认值为 false
uniqueBoolean创建唯一索引,当值为 true 时表示创建唯一索引,以避免重复数据的插入,默认为 false
namestring索引的名称。如果未指定,MongoDB 将通过连接索引的字段名和排序顺序生成一个索引名称
dropDups1Boolean在建立唯一索引时是否删除重复记录,设置为 true 则表示创建唯一索引,默认值为 false,3.0 版本之后废弃x
namestring索引的名称。如果未指定,MongoDB 将通过连接索引的字段名和排序顺序生成一个索引名称
sparseBoolean对文档中不存在的字段数据不启用索引,这个参数需要特别注意,如果设置为 true 的话,则在索引字段中不会查询出不包含对应字段的文档。默认值为 false
expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL 设定,设定集合的生存时间
vindex version索引的版本号,默认的索引版本取决于 mongod 创建索引时运行的版本
weightsdocument索引权重值,数值在 1 到 99999 之间,表示该索引相对于其他索引字段的得分权重
default_languagestring对于文本索引,该语言用于确定停用词列表以及词干分析器和令牌生成器的规则,默认为英语
language_overridestring对于文本索引,指定文档中包含要替代默认语言的语言的字段名称,默认值为 language**

为集合“course”中的 title 字段创建索引:

db.course.createIndex({“title”:1})
{
“createdCollectionAutomatically” : false,
“numIndexesBefore” : 1,
“numIndexesAfter” : 2,
“ok” : 1
}

另外,createIndex() 方法还可以同时为多个字段创建索引,如下所示:

db.course.createIndex({“title”:1, “author”:-1})
{
“createdCollectionAutomatically” : false,
“numIndexesBefore” : 2,
“numIndexesAfter” : 3,
“ok” : 1
}

索引使用规则

索引的目的是使查询尽可能高效。对于许多查询模式来说,在两个或更多的键上创建索引是必要的。索引会将其所有值按顺序保存,因此按照索引键对文档进行排序的速度要快得多。然而,索引只有在作为排序的前缀时才有助于排序。

  1. 最左原则:查询条件为db.localhost.find{age=25,name=“张三”},索引为{name:1,age:1},这时索引失效,不会起作用,因为最左原则未匹配。更正查询条件为{name=“张三”,age=25},这时索引即会命中
  2. 范围查询导致索引失效:db.localhost.find({“age”:{“ g t ” : 21 , “ gt”:21,“ gt:21,lt”:30}}).sort(“username”:1)
  3. MongoDB查询速度取决于有多少结果与查询条件相匹配:如果结果集中只是几个文档,那么 MongoDB 将不会耗费多少时间进行排序;如果结果比较多,那么速度就会很慢或者根本不能工作。如果结果超过了 32MB,MongoDB 就会报错,拒绝对这么多数据进行排序。
    要避免这个问题,则必须创建一个支持此排序操作的索引,或者将 limit 与 sort 结合使用以使结果低于 32MB。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值