背景
由于项目业务需要用到大数据量,且对事务方面要去不高,所以从各种数据库中挑选出mongodb非关系数据库为最优解,但是业务数据越来越多,导致页面接口查询效率变低。
-索引分类
- 唯一索引
- 复合索引
- 部分索引
创建索引
createIndex() 方法
MongoDB 中可以使用 createIndex() 方法来创建索引,其语法格式如下
db.collection_name.createIndex(keys, options)
参数说明如下:
- keys:由键/值对组成,其中键用来定义要创建索引的字段,值用来定义创建索引的顺序,1 表示按升序创建索引,-1 表示按降序来创建索引;
- options:可选参数,其中包含一组控制索引创建的选项,可选值如下表所示。
参数 | 类型 | 描述 |
---|---|---|
**background | Boolean | 可选参数,当值为 true 时,表示在后台构建索引,避免在创建索引的过程阻塞其它数据库操作,默认值为 false |
unique | Boolean | 创建唯一索引,当值为 true 时表示创建唯一索引,以避免重复数据的插入,默认为 false |
name | string | 索引的名称。如果未指定,MongoDB 将通过连接索引的字段名和排序顺序生成一个索引名称 |
dropDups1 | Boolean | 在建立唯一索引时是否删除重复记录,设置为 true 则表示创建唯一索引,默认值为 false,3.0 版本之后废弃x |
name | string | 索引的名称。如果未指定,MongoDB 将通过连接索引的字段名和排序顺序生成一个索引名称 |
sparse | Boolean | 对文档中不存在的字段数据不启用索引,这个参数需要特别注意,如果设置为 true 的话,则在索引字段中不会查询出不包含对应字段的文档。默认值为 false |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL 设定,设定集合的生存时间 |
v | index version | 索引的版本号,默认的索引版本取决于 mongod 创建索引时运行的版本 |
weights | document | 索引权重值,数值在 1 到 99999 之间,表示该索引相对于其他索引字段的得分权重 |
default_language | string | 对于文本索引,该语言用于确定停用词列表以及词干分析器和令牌生成器的规则,默认为英语 |
language_override | string | 对于文本索引,指定文档中包含要替代默认语言的语言的字段名称,默认值为 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
}
索引使用规则
索引的目的是使查询尽可能高效。对于许多查询模式来说,在两个或更多的键上创建索引是必要的。索引会将其所有值按顺序保存,因此按照索引键对文档进行排序的速度要快得多。然而,索引只有在作为排序的前缀时才有助于排序。
- 最左原则:查询条件为db.localhost.find{age=25,name=“张三”},索引为{name:1,age:1},这时索引失效,不会起作用,因为最左原则未匹配。更正查询条件为{name=“张三”,age=25},这时索引即会命中
- 范围查询导致索引失效:db.localhost.find({“age”:{“ g t ” : 21 , “ gt”:21,“ gt”:21,“lt”:30}}).sort(“username”:1)
- MongoDB查询速度取决于有多少结果与查询条件相匹配:如果结果集中只是几个文档,那么 MongoDB 将不会耗费多少时间进行排序;如果结果比较多,那么速度就会很慢或者根本不能工作。如果结果超过了 32MB,MongoDB 就会报错,拒绝对这么多数据进行排序。
要避免这个问题,则必须创建一个支持此排序操作的索引,或者将 limit 与 sort 结合使用以使结果低于 32MB。