创建索引:db.$cname.createIndex({keys, options} )
例:
db.col1.createIndex({name:1},{unique:true}) //给name创建范围唯一索引
db.col1.createIndex({age:"hashed"}) //给age创建hash索引,hash索引不能设置唯一键
注:hashed索引需要保存hash值,所以占用空间会大一点。
开启分片:sh.enableShareding(database)
给集合初始化分片:sh.shardCollection( namespace, key, unique, options ),
- namespace:"dbname.colname",
- key:均衡字段,可以有多个字段
- unique:是否设置唯一索引
- options:分片选项,比如设置初始chunk的总数量:numInitialChunks
例:
sh.shardCollection("d1.col1",{age:"hashed"},false,{numInitialChunks:1024})
sh.shardCollection("d1.col1",{num:1},true,{numInitialChunks:1024})
如果集合中已经有数据,则进行分片时对数据量有要求,数据量超过限制则不能进行分片,限制跟分片键的索引大小成反比,跟chunksize成正比。
分片键:
- 一个要能足够的分散,这样请求压力才能平均分散到各个分片。如果键值比较单调,比如按时间连续,则不适合使用范围分片,可以采用hashed分片。
- 二是要有足够的多样性,这样才能均衡到各个分片。
- 分片键必须先创建一个索引才能设置分片,索引可以是以分片键为前缀。
- 分片键如果没有使用_id,则在整个集合中_id不能保证唯一,只能在各个分片上保证唯一。
- 除_id外,只能在分片键或分片键的前缀创建唯一索引。这也就决定了:启用分片的集合不能创建分片键及其前缀以外的唯一索引,在创建了唯一索引的集合上也不能使用其他分片键开启分片。
查看数据库信息:
db.stats()