索引创建
1.索引提高查询速度,降低写入速度,权衡常用的查询字段,
不必在太多列上建索引
2.在mongodb中,索引可以按字段升序/降序来创建,便于排序
3.默认是用btree来组织索引文件,也允许简历hash索引
查看查询计划
db.[collection].find(query).explain();
"cursor" : "BasicCursor", ----说明没有索引发挥作用
"nscannedObjects" : 1000 ---理论上要扫描多少行
cursor" : "BtreeCursor sn_1", 用到的btree索引
常用命令:
查看当前索引状态:
db.[collection].getIndexes();
创建普通的单列索引:
db.[collection].ensureIndex({field:1/-1}):// 1是升序,-1是降序
删除单个索引:
db.[collection].dropIndex({filed:1/-1});
一下子删除所有索引:
db.[collection].dropIndexes();
创建多列索引:
db.[collection].ensureIndex({field1:1/-1, field2:1/-1});
创建子文档索引:
db.[collection].ensureIndex({field.subfield:1/-1});
创建唯一索引:
db.[collection].ensureIndex({field.subfield:1/-1},{unique:true});
创建稀疏索引:
稀疏索引的特点:如果针对field做索引,针对不含field列的文档,
将不建立索引,与之相对,普通索引,会把该文档的field列的值任务null,
并建立索引,
适用于:小部分文档含有某列时
db.[collection].ensureIndex({field:1/-1},{sparse:true});
例
db.tea.find();
{ "_id" : ObjectId("5275f99b87437c610023597b"), "email" : "a@163.com" }
{ "_id" : ObjectId("5275f99e87437c610023597c"), "email" : "b@163.com" }
{ "_id" : ObjectId("5275f9e887437c610023597e"), "email" : "c@163.com" }
{ "_id" : ObjectId("5275fa3887437c6100235980") }
如上内容,最后一行没有email列
如果分别加普通索引,和稀疏索引
对于最后一行的email 分别当做null和忽略最后一行来处理
根据{email:null}来查询,前者能查到,而稀疏索引查不到最后一行
创建哈希索引
哈希索引速度比普通索引快,但是,不能对范围查询进行优化
适用于–随机性强的散列
db.[collection].ensureIndex({file:’hashed’});
重建索引
一个表经过很多次修改后,导致表的文件产生空洞,索引文件也是如此
可以通过索引的重建,减少索引文件碎片,并提高索引的效率
类似mysql中的 optimize table
db.[collection].reIndex();