5. 索引操作
在任何的数据库之中, 索引都是一种提升数据库检索性能的手段,这一点在MongoDB数据库之中同样是存在的, 在MongoDB数据库里面依然会存在有2中的索引创建: 是自动创建的, 另外一种索引是手工创建的。
范例: 重新准备一个新的简单集合
db.students.drop()
db.students.insert({"name": "张三", "sex":"男","age": 19, "score": 89, "address": "海淀区"})
db.students.insert({"name": "李四", "sex":"女","age": 20, "score": 59, "address": "朝阳区"})
db.students.insert({"name": "王五", "sex":"女","age": 19, "score": 99, "address": "西城区"})
db.students.insert({"name": "赵六", "sex":"男","age": 20, "score": 100, "address": "东城区"})
db.students.insert({"name": "孙七", "sex":"男","age": 19, "score": 20, "address": "海淀区"})
db.students.insert({"name": "王八", "sex":"女","age": 21, "score": 0, "address": "海淀区"})
db.students.insert({"name": "刘九", "sex":"男","age": 19, "score": 70, "address": "朝阳区"})
db.students.insert({"name": "钱十", "sex":"女","age": 21, "score": 56, "address": "西城区"})
此时在students集合上并没有去设置任何的索引, 那么下面通过getIndexes()函数来观察在students集合里面已经存在的索引内容
db.collections.getIndexes()
现在发现会存在有一个"_id"列的索引内容。但是如果要想创建自己的索引, 则可以使用如下的语法:
索引创建: db.collections.ensureIndex({列: 1})
|- 设置的1表示索引将按照升序的方式进行排列, 如果使用降序设置为"-1"
范例: 创建一个索引, 在age字段上设置一个降序索引;
db.students.ensureIndex({"age": -1})
此时并没有设置索引的名字, 所以名字是自命名的. 命名规范: "字段名称_索引的排序模式"。
范例: 针对于当前的age字段上的索引做一个分析.
db.students.find({"age": 19}).explain()
此时的查询使用了索引的技术, 但是下面再来观察一个查询, 不适用索引字段。
范例: 针对于score字段上的设置查询
db.students.find({"score": {"$gt": 60}}).explain()
此时在score字段上并没有设置索引, 所以当前的索引形式就变成了全集扫描的模式.
但是如果说, 现在换一种形式, 年龄和成绩一起执行判断查询?
db.students.find({"$or": [
{"age": {"$gt": 19}},
{"score": {"$gt": 60}}
]}).explain()
这是时候虽然age字段上存在有索引, 但是一个明显的问题, 由于score字段上没有索引, 所以依然使用的是全表扫描功能, 那么为了解决此事的问题,可以使用一个符合索引.
db.students.ensureIndex({"age": -1,"score": -1}, {name: "age_-1_score_-1_index"})
范例: 默认使用索引
db.students.find({"age": 19, "score": 89}).explain()
但是如果换到了条件之中
db.students.find({
{"age": {"$gt": 19}},
{"score': {"$gt": 60}}
}).explain()
现在发现并没有使用索引, 所以这个时候看能否强制使用一次索引。hint()函数为强制使用索引操作
范例: 强制使用索引
db.students.find({"$or": [
{"age": {"$gt": 19}},
{"score": {"$gt": 60}}
]}).hint({"age": -1, "score": -1}).explain()
如果正常来讲, 这个代码根本就不可能调用默认的索引执行, 但是我们觉得不好, 所以需要使用hint()函数来强制MongoDB告诉你必须使用一次索引, 由于此时在age和score两个字段上已经设置了复合索引,那么现在使用的就是默认的复合索引.
但是如果在一个集合里面设置了太多的索引, 实际上会导致性能下降, 那么就可以删除索引.
范例: 删除一个索引
db.students.dropIndex({"age": -1, "score": -1})
可是如果只是一个一个删除索引也会很麻烦, 所以提供有删除全部索引的操作.
范例: 删除全部索引
db.students.dropIndexes()
所谓的删除全部索引指的就是非"_id"的索引,所有的自定义索引.
5.1