基本特点
建立索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录。
创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
因为,增加索引也有许多不利的方面。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
基础语法
db.集合名.createIndex(待创建索引的列 [,额外选项])
参数:
待创建的列:{键:1…键:-1}
说明:1升序,-1降序,例如{age:1}表示创建age索引并按照升序的方式存储
额外选项:设置索引的名称或者唯一索引等等
-
全部删除
db.集合名.dropIndexes()
-
删除指定
db.集合名.dropIndex(索引名)
db.集合名.getIndexes()
简单练习
准备数据
向数据库中增加十万条数据
use test5
for(var i=0;i<100000;i++){
db.c1.insert({name:"aaa"+i,age:i});
}
创建普通索引
1 . 给name列创建普通索引并查看所有索引
//创建普通索引
db.c1.createIndex({name:1})
//查看所有索引
db.c1.getIndexes()
2.删除name索引并查看
重点
:先查看所有索引获取要删除的索引名
//删除name列的索引
db.c1.dropIndex('name_1')
//查看所有索引
db.c1.getIndexes()
3.给name列创建索引并命名为name_czy(自定义)
//给name列创建索引并命名为name_czy
db.c1.createIndex({name:1},{name:"name_czy"})
//查看所有索引
db.c1.getIndexes()
创建复合索引
一次性给多个字段添加索引
db.集合名.createIndex({键1:存储方式,键2:存储方式...})
给name和age两个字段添加索引
db.c1.createIndex({name:1,age:1})
db.c1.getIndexes()
创建唯一索引
语法
db.集合名.createIndex(待添加的索引的列, [unique:列名])
给name添加普通索引
//删除所有索引
db.c1.dropIndexes()
//创建唯一索引
db.c1.createIndex({name:1},{unique:"name"})
分析索引
语法
db.集合名.find().explain('executionStats')
扫描方式
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引去检索指定document
-
age列未添加索引扫描
db.c1.find({age:18}).explain('executionStats')
-
age列添加索引扫描
//添加普通索引
db.c1.createIndex({age:1})
//扫描
db.c1.find({age:18}).explain('executionStats')
选择规则
-
为常做条件、排序、分组的字段建立索引
-
选择唯一性索引
-
选择较小的数据列,为较长的字符串使用前缀索引