在讲索引前先补一个小知识,即数据取样。
随机取样
可以实用$sample操作符从文档中取样,达到随机取样的效果。每次执行的效果都会不一样。
# 随机取2个元素
db.employees.aggregate({$sample: {size: 2}});
同样的,可以使用 $match操作符匹配条件再随机筛选(可以用于分层抽样)。
# 从年龄超过30的人员中随机取2个元素
db.employees.aggregate(
{
$match: {age: {$gt: 30}}},
{$sample: {size: 2}
}
);
查看索引
可以使用 db.collection.getIndexes()
查看数据集当前索引。
db.employees.getIndexes();
返回的结果如下(注意4.4版本以下会多返回一个 ns
字段):
[
{
"v" : 2,
"key" : { "_id" : 1 },
"name" : "_id_"
}
]
其中_id 是默认创建的唯一索引。
创建索引
创建索引使用 db.collections.createIndex({key: 1}),其中1为索引升序排列,-1为降序排列。
db.employees.createIndex({dept: 1});
再次查看索引可以看到如下结果:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"dept" : 1
},
"name" : "dept_1"
}
]
也可以指定索引的名称,用于描述索引,支持中文。
db.employees.createIndex({ age: -1}, {name: '年龄降序索引'});
哈希索引
可以指定索引为哈希模式,这对于使用等式查询时更高效,但范围查询的话比较低效。对于同一个字段可以同时指定哈希和升序降序索引(实际升降序索引也可以同时创建)。
db.employees.createIndex({ age: 'hashed'}, {name: '年龄哈希索引'});
查询索引可以看到在 age 上建立了两个索引。
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"dept" : 1
},
"name" : "dept_1"
},
{
"v" : 2,
"key" : {
"age" : -1
},
"name" : "年龄降序索引"
},
{
"v" : 2,
"key" : {
"age" : "hashed"
},
"name" : "年龄哈希索引"
}
]
移除索引
移除索引可以通过两种方式进行,一是使用索引名字,而是使用字段索引类型,均使用 dropIndex
操作。
# 按索引名称删除:年龄哈希索引
db.employees.dropIndex('年龄哈希索引');
# 按字段删除:年龄的降序索引
db.employees.dropIndex({age: -1});
总结
从索引的操作来看,MongoDB 的索引相比SQL更为简单、灵活而且多样。实际过程中可以通过索引加快查询速度,后续将介绍其他索引的操作。
网友评论