类似 MySQL
,在使用 MongoDB
时随着集合中数据量的增加,查询效率低,通过添加索引有立竿见影的效果。记录一下通过命令为集合添加索引。
场景:有一个数据集合 api_log
包含 created
字段,在倒序查询时效率低下,计划为字段添加索引。
连接服务进入数据库
使用 mongo
客户端连接 MongoDB
服务,查看数据库进入确认集合。
# 连接 mongo
mongo --host 127.0.0.1 --port 27017
# 查看数据库列表
> show dbs
data_logs 3.765GB
# 切换数据库
> use data_logs
switched to db data_logs
# 查看数据集合
> show collections
api_log
celery_taskmeta
索引查看及创建
查看现有索引,为 created
创建单字段升序索引,其中添加 background: true
配置 MongoDB
会在后台创建索引。这意味着在索引创建期间,集合上的读写操作不会被完全阻塞,而是会在后台逐步完成索引的创建,减小对读写性能的影响。
# 查看集合现有索引
> db.api_log.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "data_logs.api_log"
},
{
"v" : 2,
"unique" : true,
"key" : {
"hash_str" : 1
},
"name" : "hash_str_1",
"ns" : "data_logs.api_log"
}
]
# 为 created 字段创建单字段升序索引
> db.api_log.createIndex({ created: 1 }, { background: true })
确认创建完成
通过命令确认索引是否创建完成。
# 确认创建索引命令是否执行完成
> db.currentOp({ "command.createIndexes": "api_log" })
{ "inprog" : [ ], "ok" : 1 }
# 查看执行创建索引后的索引
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "data_logs.api_log"
},
{
"v" : 2,
"unique" : true,
"key" : {
"hash_str" : 1
},
"name" : "hash_str_1",
"ns" : "data_logs.api_log"
},
{
"v" : 2,
"key" : {
"created" : 1
},
"name" : "created_1",
"ns" : "data_logs.api_log",
"background" : true
}
]
除了单字段索引,MongoDB
还包含复合索引,文本索引,地理空间索引,哈希索引等其他形式的索引,具体实现参考 chatgpt
。