索引类型:
样例数据
db.account.insert({_id:1,
account:"xiao",
password:"xxxxx",
type:"1",
userinfo:[
{name:'xiao',sex:'M',phone:"158893242"},
{name:'xiao1',sex:'M',phone:"158893243"},
{name:'xiao2',sex:'W',phone:"158893244"},
],
createTime:""
})
1. _id: 默认具有一个索引(无需手动创建,系统会自动创建)如果没有指定_id 会自动创建一个12字节的objectid
2.单域:就是单个域(字段)创建索引, 如 db.account.createIndex({account:1})
3.组合: 就是多个字段组合起来, 如 db.account.createIndex({account:1,password:1})
4.多键: 就是一个字段里包含数组,数组里面又有字段, 就如 userinfo
我们想查找用户为xiao1的账户,为了加快速度,我们需要为name 建立多键索引,
如 db.account.createIndex({"userinfo.name":1}) , userinfo使用explain 会看到 "isMultiKey" : true
5. 地理: 分球型 跟 平面型,这个后面再详细讲解
6. 文本:就是一个字符串,或者一个字符串的数组, 如 db.account.createIndex( { userinfo: "text" } ),
一个集合最多只有一个文本索引,使用$text 进行文本索引 { $text: { $search: <string>, $language: <string> } }
7. 哈希: 不支持 multi-key ,支持分片key,支持等值查询,不支持范围查询,
不支持创建组合索引,但是可以创建hash 跟 普通的2 个索引
db.account.createIndex( { account: "hashed" } )
索引的属性
a. Unique Indexes,
不允许记录有重复值,允许唯一列值,存在一条不包含该列的记录,如下
db.a.insert({x:1,y:'a'})
db.a.insert({x:2,y:'b'})
db.a.createIndex({x:1},{unique:true})
db.a.insert({y:'c'}) ### 唯一约束 允许这值存在
db.a.insert({y:'d'}) ### 已经存在一条,所以报错
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.a index: x_1 dup key: { : null }"
b. Sparse Indexes, 就是如何索引域不存在,那么就不会有索引记录,可以结合唯一索引去拒绝没有域的重复记录
他仅仅只对这个索引列有列名(包括列为null)的记录创建索引,如:集合scores,他有下列数据
db.scores.insert( { "userid": "AAAAAAA", "score": 43 } )
db.scores.insert( { "userid": "BBBBBBB", "score": 34 } )
db.scores.insert( { "userid": "CCCCCCC" } )
db.scores.createIndex({score:1},{sparse:true}) ### 创建稀疏索引
那么 score_1 这个稀疏(sparse)索引 不包含 { "userid": "CCCCCCC" }的记录
如果使用sort 函数对score字段排哦排序那么是不使用稀疏索引的,如
db.scores.find().sort({score:-1}) ### 这个是不使用sparse索引的,若要使用hint
db.scores.find().sort({score:-1}).hint({score:1}) ### 使用的sparse索引,但是返回的记录不完全(只返回有score列,没这个列的值不返回数据)
也可以创建稀疏唯一索引,
如:db.scores.createIndex({score:1},{sparse:true,unique:true}) ### 创建稀疏唯一索引
作用:限制score不重复,并且对没有score列的记录不做限制, 注意跟唯一索引对比一下
c. TTL Indexes , 就是设定一个时间,后台会自动清理过期数据
如果这个列是数组,数组里面有多个日期,那么就会用最早的日期,
如果不是日期,或者日期数组那么是不会生效的
下面是创建TTL索引的样例:
db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )